以下查询在 MySQL 中是否有效:
SELECT * FROM table WHERE field & number = number;
# to find values with superset of number's bits
SELECT * FROM table WHERE field | number = number;
# to find values with subset of number's bits
...是否已为字段创建索引?
如果没有,有没有办法让它运行得更快?
最佳答案
更新:
有关性能详细信息,请参阅我的博客中的此条目:
SELECT * FROM table WHERE field & number = number
SELECT * FROM table WHERE field | number = number
该索引可以通过两种方式发挥作用:
- 避免早期的表扫描(因为要比较的值包含在索引本身中)
- 限制检查值的范围。
上面查询中的两个条件都不是sargable,这是索引将不会用于范围扫描(使用现在的条件)。
但是,第 1
点仍然成立,索引很有用。
如果您的表平均每行包含 100
字节和 1,000,000
记录,那么表扫描将需要扫描 100 Mb
数据。
如果您有一个索引(具有 4
字节键、6
字节行指针和一些内部开销),查询将只需要扫描 10 Mb
数据加上表中的额外数据(如果过滤成功)。
- 如果您的条件不是选择性的(您很有可能匹配该条件),表扫描会更有效。
- 如果您的条件是选择性的(您匹配条件的可能性很低),索引扫描会更有效。
这两个查询都需要扫描整个索引。
但是通过重写 AND
查询,您也可以从索引的范围中受益。
这个条件:
字段&数字=数字
只有 number
集的最高位也在 field
中设置时才能匹配字段。
你应该只为查询提供这个额外的条件:
SELECT *
FROM table
WHERE field & number = number
AND field >= 0xFFFFFFFF & ~((2 << FLOOR(LOG(2, 0xFFFFFFFF & ~number))) - 1)
这将使用粗略过滤的范围和精细过滤的条件。
最后未设置的 number
位越多越好。
关于mysql - (按位)MySQL 中的超集和子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457218/