更新:
參見性能細節在我的博客此項:
SELECT * FROM table WHERE field & number = number
SELECT * FROM table WHERE field | number = number
該指數可以用兩種方法是有效的:
- 爲了避免早期表掃描(因爲比較值包含在索引本身)
無論條件在查詢是可優化搜索,這是該指數將不會被用於範圍掃描(與條件,因爲它們是現在)。
但是,點1
仍然成立,並且該索引可能有用。
如果您的表中包含每行平均有100
個字節和1,000,000
記錄,則表掃描將需要掃描100 Mb
數據。
如果你有一個索引(用4
字節鍵,6
字節行指針和一些內部開銷),查詢需要如果濾波器成功僅僅10 Mb
數據和其它的數據從表掃描。
- 如果您的條件不具有選擇性(您有很高的可能性以匹配條件),表掃描更有效。
- 如果您的情況有選擇性(您的概率很低以符合條件),索引掃描更有效。
這兩個查詢都需要掃描整個索引。
但通過重寫AND
查詢,您也可以從索引範圍中受益。
這種情況:
field & number = number
如果number
集的最高位在field
設置得只能匹配的字段。
,並且應該只提供這種額外的條件查詢:
SELECT *
FROM table
WHERE field & number = number
AND field >= 0xFFFFFFFF & ~((2 << FLOOR(LOG(2, 0xFFFFFFFF & ~number))) - 1)
這將使用範圍用於粗過濾和精過濾的條件。
number
的位數越多,結尾越好。
這是一個很好的問題,但您需要接受一些答案 - 20%不會邀請人們嘗試回答您 – Fragsworth 2009-09-21 22:34:29