代码之家  ›  专栏  ›  技术社区  ›  guo

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

  •  0
  • guo  · 技术社区  · 6 年前

    例如,索引是 (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栏) ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Bill Karwin    6 年前

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

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

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