例如,索引为(column1,column2)
。假设我们运行查询select * from some_table where column2 > 3 and column1<2
,MySQL是否足够聪明,可以将查询重新排序为select * from some_table where column1<2 and column2 > 3
,然后使用索引(column1,column2)
?
答案 0 :(得分:0)
是的,MySQL的优化器可以判断布尔值AND
是代数可交换的,也就是说,A AND B
在逻辑上与B AND A
相同。
它可以在保持逻辑等价的同时对词序进行重新排序以匹配索引顺序。
但是,在您显示的情况下,column1
上的条件是范围条件,因此MySQL无法使用索引在第二列中进行搜索。 column2
中的值是按column1的值排序的,因此它们实际上没有顺序。搜索行,column2 > 3
无论如何都必须搜索与第一个术语匹配的行的每个子集,到那时,存储引擎会将这些行读入内存,因此使用索引几乎没有价值。 / p>