2011-03-18 538 views
3

我有一个查询,看起来像指数:优化MySQL查询使用上按位where子句

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

虽然我对资源有指标不使用它。如何优化使用按位操作。

+0

嗨。也许这个链接可以帮助你。 http://explainextended.com/2009/10/01/bitwise-operations-and-indexes/ – 2011-03-18 13:11:40

+0

我确实知道那篇文章,我正在尝试实现类似于该方法的内容,但我没有要比较的数字用。 – Pentium10 2011-03-18 13:26:57

回答

8

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

在MySQL性能论坛中对此有一些讨论:http://forums.mysql.com/read.php?24,35318(“索引扫描是否可能进行按位比较?”),其中一位MySQL员工建议一个解决方案,该解决方案基于每个表具有一行的表)对和做一堆连接。我猜想,这个工作的效果将取决于你的特定应用。

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

3

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

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

例如 - 此不使用索引

其中indexedCol * 2 = 6;

但这 -

其中indexedCol = 6/2;

不知道您是否可以在按位操作时实现该操作。

+0

赞成反对解释。 – Jai 2011-03-18 14:22:33

0

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