优化mysql查询以在Bitwise where子句上使用索引

时间:2011-03-18 12:55:40

标签: mysql sql optimization bit-manipulation

我的查询如下:

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

虽然我有资源索引但它没有使用它。如何优化以按位操作使用。

3 个答案:

答案 0 :(得分:9)

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

在MySQL性能论坛中对此进行了一些讨论:http://forums.mysql.com/read.php?24,35318(“可以通过逐位比较进行索引扫描吗?”),其中MySQL员工建议基于每个表有一行的解决方案(事情, set-bit)对并做一堆连接。我猜这个有多好用将取决于你的特定应用。

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

答案 1 :(得分:4)

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

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

例如 - 这不使用索引

其中indexedCol * 2 = 6;

但这确实 -

其中indexedCol = 6/2;

不确定您是否可以通过按位和按钮来实现这一点虽然操作。

答案 2 :(得分:0)

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