因此,假设我有一个包含两个索引的表——一个在 a 列上,一个在 a、b 和 c 列上。
我注意到,根据索引定义中列的顺序,即使在 ON 中引用了多列索引中的所有三列,MySQL 也可能最终使用单列索引而不是多列索引JOIN 的一部分。
这就引出了一个问题……如何确定列的理想顺序?你只需要蛮力吗?
索引中列的顺序并非无关紧要。有一种方法。
首先,一个或多个涉及等式项的列与 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)
.
我在演示文稿如何设计索引中更详细地解释了这一点,真的。
MySQL 使用索引的方式和时间取决于表上的统计信息。使用统计数据,它可能会决定其中一个。您可以强制它使用特定索引,但这通常不是一个好主意。有关更多信息,请参阅此链接。
随着表的增长和统计数据的变化,这是要记住的事情。因此,查询可能今天使用一个索引运行另一个明天。MySQL 将确定使用哪个更好。这就是为什么强制索引只是在某些时候让自己陷入困境。
您不能永远创建一个完美的索引,因此您需要做的是创建一个索引,以在查询变慢时帮助加快查询速度。所以打开慢日志并监控它。当查询开始运行缓慢时,请执行 EXPLAIN,然后找出如何优化。哦,有时您可能不得不删除索引,因为它们可能不再被使用。
询问您是否需要更多信息。