mysql - (按位)MySQL 中的超集和子集

标签 mysql optimization bit-manipulation subset

以下查询在 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

该索引可以通过两种方式发挥作用:

  1. 避免早期的表扫描(因为要比较的值包含在索引本身中)
    • 限制检查值的范围。

上面查询中的两个条件都不是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/

相关文章:

MySQL DATE_ADD() 来自另一个表的周期

php - 这行 PHP 是否足以防止 MySQL 注入(inject)?

mysql - Joomla Jdatabase select 语句不工作

c++ - 支持单个位偏移的类似“memcpy”的函数?

c - 从低到高的位顺序/C 中带有位域的映射结构

sql - MySQL 中如果字段为空则返回 0

c++ - 绘制许多四边形

Javascript 多重分配重新评估或结果传递?

c# - 在 C# 中,对 ref 参数的赋值何时有效?

c - 将 4 字节值中的特定位提取到 C 中的新变量中