【问题标题】:Optimize mysql query to use index on a Bitwise where clause优化 mysql 查询以在按位 where 子句上使用索引
【发布时间】:2011-07-18 03:49:09
【问题描述】:

我有一个查询,如下所示:

select count(*) from m1
WHERE  (m1.`resource` & 1472 );

虽然我有资源索引,但它不使用它。如何优化它以用于按位运算。

【问题讨论】:

标签: mysql sql optimization bit-manipulation


【解决方案1】:

我不相信 MySQL 可以使用索引进行按位运算。

在 MySQL 性能论坛中对此进行了一些讨论:http://forums.mysql.com/read.php?24,35318(“是否可以使用按位比较进行索引扫描?”)其中一位 MySQL 员工建议了一种解决方案,该解决方案基于一个表每行(事物,设置-位)配对并进行一堆连接。我猜它的效果在很大程度上取决于您的特定应用程序。

根据http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html,索引不能用于对SET 值(通过整数和按位运算实现)执行相同类型的操作。我原以为如果对按位运算有任何巧妙的索引优化,它已经应用于SETs。

【讨论】:

    【解决方案2】:

    如果 MySQL 认为它必须对表中的每一行执行计算,它就不会使用索引。

    优化这些查询的唯一方法是从资源列中删除计算。如何做到这一点取决于您想要达到的目标。

    例如- 这不使用索引

    其中 indexedCol*2 =6;

    但这确实-

    其中 indexedCol =6/2;

    不确定您是否可以在按位 & 运算中实现这一点。

    【讨论】:

      【解决方案3】:

      在 Sql server 上,它确实使用按位运算的索引。我正在尝试重现 MySql 上的性能,但不能.... MySql 是一个好主意,但如果他们不考虑按位运算的基本性能,这确实是一个很大的失望!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多