3

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

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

这就引出了一个问题……如何确定列的理想顺序?你只需要蛮力吗?

4

2 回答 2

14

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

  • 首先,一个或多个涉及等式项的列与 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 x, y, z
    . . .
    WHERE a = 1 AND b = 2 AND c > 3
    

这将导致在(a, b, c, x, y, z).

我在演示文稿如何设计索引中更详细地解释了这一点,真的

于 2013-10-18T00:16:22.543 回答
1

MySQL 使用索引的方式和时间取决于表上的统计信息。使用统计数据,它可能会决定其中一个。您可以强制它使用特定索引,但这通常不是一个好主意。有关更多信息,请参阅链接。

随着表的增长和统计数据的变化,这是要记住的事情。因此,查询可能今天使用一个索引运行另一个明天。MySQL 将确定使用哪个更好。这就是为什么强制索引只是在某些时候让自己陷入困境。

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

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

于 2013-10-18T00:10:16.740 回答