我的查询如下:
select count(*) from m1
WHERE (m1.`resource` & 1472 );
虽然我有资源索引但它没有使用它。如何优化以按位操作使用。
答案 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是个好主意但是如果他们不考虑按位运算的基础性能,那么这确实是一个很大的失望!