Py学习  »  DATABASE

mysql会根据多列索引顺序重新排序where条件吗?

guo • 4 年前 • 567 次点击  

例如,索引是 (column1,column2) . 假设我们运行一个查询 select * from some_table where column2 > 3 and column1<2 ,mysql是否足够聪明,可以将查询重新排序为 select * from some_table where column1<2 and column2 > 3 然后使用索引 (第1栏,第2栏) ?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40712
 
567 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Bill Karwin
Reply   •   1 楼
Bill Karwin    5 年前

是的,mysql的优化器可以看出 AND 是代数交换的,也就是说, A AND B 逻辑上与 B AND A .

它可以在保持逻辑等价性的情况下重新排序项以匹配索引顺序。

但是,在你展示的情况下, column1 是范围条件,因此MySQL无法使用索引在第二列中搜索。中的值 column2 是按第1列的值排序的,所以它们实际上没有顺序。在其中搜索行 column2 > 3 无论如何,必须搜索与第一个项匹配的每一行子集,到那时,存储引擎已经将这些行读入内存,因此使用索引没有什么价值。