不在where子句中使用索引

时间:2013-07-06 18:26:30

标签: mysql indexing where clause

如果我在where子句中有以下内容:

( approps_precio * moneda_valor BETWEEN 2000 AND 6000)

它不使用idx_approps_precio索引。

但是

( approps_precio BETWEEN 2000 AND 6000)

做得很好。

有没有办法添加*操作并仍然使用索引?。

提前致谢。

3 个答案:

答案 0 :(得分:1)

moneda_valor是常数吗?如果没有,当你查找approps_precio的值乘以moneda_valor时,approps_precio上的索引就没用了。

答案 1 :(得分:1)

我一直在寻找一些官方文档,以支持Paul DuBois(尽管是MySQL文档团队的成员)在他的书{{第五章“查询优化”中所说的内容。 3}}:

  

使索引列在比较表达式中独立。如果在函数调用中使用列或在算术表达式中使用更复杂的术语,MySQL无法使用索引,因为它必须为每一行计算表达式的值。有时这是不可避免的,但很多时候您可以重写查询以使索引列自行显示。

我能找到的最好的是内部手册中的MySQL (Developer's Library)部分:

  

但是,MySQL不支持算术存在的转置。因此:

WHERE 5 = -column1 
     

与以下内容不同:

WHERE column1 = -5 
     

转换为form = constant形式的表达式是索引查找的理想选择。

在这种情况下,可以通过approps_precio除以重写过滤条件来利用moneda_valor上的索引:

WHERE approps_precio BETWEEN 2000/moneda_valor AND 6000/moneda_valor

请注意,MySQL仍然需要评估每条记录的分区,所以我不相信会保存很多。

答案 2 :(得分:0)

当moneda valor为null时,*操作使您的值为0,因此超出范围。所以你可以把它重写为:

approps_precio BETWEEN 2000 AND 6000 and moneda_valor IS NOT NULL