更新:
有关性能详细信息,请参阅我的博客中的此条目:
SELECT * FROM table WHERE field & number = number
SELECT * FROM table WHERE field | number = number
该索引可以通过两种方式发挥作用:
- 为了避免早期的表扫描(因为要比较的值包含在索引本身中)
上述查询中的两个条件都不是sargable,这是索引不会用于范围扫描(条件与现在一样)。
但是,点1
仍然成立,并且索引可能很有用。
如果您的表包含100
平均每行的字节数和1,000,000
记录,那么表扫描将需要扫描100 Mb
数据。
如果您有一个索引(带有4
-byte 键、6
-byte 行指针和一些内部开销),如果过滤器成功,查询将只需要扫描10 Mb
数据和表中的其他数据。
- 如果您的条件不是选择性的(您很可能匹配条件),则表扫描会更有效。
- 如果您的条件是选择性的(您匹配条件的可能性较低),则索引扫描会更有效。
这两个查询都需要扫描整个索引。
但是通过重写AND
查询,您也可以从索引范围内受益。
这个条件:
field & number = number
number
如果set的最高位也设置了,则只能匹配字段field
。
你应该只为查询提供这个额外的条件:
SELECT *
FROM table
WHERE field & number = number
AND field >= 0xFFFFFFFF & ~((2 << FLOOR(LOG(2, 0xFFFFFFFF & ~number))) - 1)
这将使用粗略过滤的范围和精细过滤的条件。
最后未设置的位number
越多越好。