如果我在where子句中有以下内容:
( approps_precio * moneda_valor BETWEEN 2000 AND 6000)
它不使用idx_approps_precio索引。
但是
( approps_precio BETWEEN 2000 AND 6000)
做得很好。
有没有办法添加*操作并仍然使用索引?。
提前致谢。
答案 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