找到多列索引的最优顺序

时间:2013-10-17 21:59:26

标签: mysql sql indexing

因此,假设我有一个包含两个索引的表 - 一个在列a上,另一个在列a,b和c上。

我注意到,根据索引定义中列的顺序,MySQL可能会使用单列索引而不是多列索引,即使多列索引中的所有三列都被引用在JOIN的ON部分。

这有点问题......如何找出列的理想排序?你只需要暴力吗?

2 个答案:

答案 0 :(得分:11)

索引中列的顺序无关紧要。有一种方法。

  • 首先,相等术语中涉及的一个或多个列与AND结合。

    WHERE a = 1 AND b = 2
    
  • 其次,范围术语中涉及的单个列。要么是这样,要么是一个或多个列参与排序。

    WHERE a = 1 AND b = 2 AND c > 3
    

    WHERE a = 1 AND b = 2
    ORDER BY c, d
    
  • 第三,select-list中引用的列,但未通过搜索或排序引用。

    SELECT x, y, z
    . . .
    WHERE a = 1 AND b = 2 AND c > 3
    

这将导致(a, b, c, x, y, z)上的索引。

我在演示How to Design Indexes, Really中更详细地解释了这一点。

答案 1 :(得分:1)

MySQL如何以及何时使用索引是基于表的统计信息。使用统计数据可能决定其中一个。您可以强制它使用特定的索引,但这通常不是一个好主意。有关详细信息,请参阅this链接。

随着表的增长和更改统计信息更改,需要记住以下事项。因此,查询可能会在明天另一个索引运行。 MySQL将确定哪个更好用。这就是为什么迫使一个指数在某个时刻只是在脚下射击。

永远无法创建一个完美的索引,所以你需要做的是创建一个索引,当它变慢时,它将有助于加速查询。所以打开慢速日志并监控它。当查询开始运行缓慢时,请执行EXPLAIN,然后找出如何优化。哦,在某一点上你可能不得不删除索引,因为它们可能不再被使用了。

询问您是否需要更多信息。