例如,索引是 (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)
?
最佳答案
是的,MySQL的优化器可以判断 bool AND
是代数交换的,也就是说,A AND B
在逻辑上与B AND A
相同>。
它可以在保留逻辑等效性的同时对术语进行重新排序以匹配索引顺序。
但是,在您显示的情况下,column1
上的条件是范围条件,因此 MySQL 无法使用索引在第二列中进行搜索。 column2
中的值按照 column1 的值进行排序,因此它们实际上没有顺序。搜索 column2 > 3
的行必须搜索与第一项匹配的行的每个子集,到那时,存储引擎会将这些行读入内存,因此没有什么值(value)使用索引。
关于mysql - MySQL会根据多列索引顺序重新排序where条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54139436/