我知道索引的重要性以及连接顺序如何改变性能。我已经阅读了大量与多列索引相关的内容,但没有找到我的问题的答案。
我很好奇,如果我做一个多列索引,它们指定的顺序是否重要。我的猜测是不会,并且引擎会将它们视为一个组,其中顺序并不重要。但我想验证一下。
例如,来自mysql的网站(http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html)
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) );
在任何情况下,以下内容会更好还是等效,是否会有任何好处?
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (first_name,last_name) );
具体来说:
INDEX name (last_name,first_name)
对比
INDEX name (first_name,last_name)
两个索引不同。这在 MySQL 和其他数据库中都是如此。 MySQL 在文档中解释了不同之处.
考虑两个索引:
这两者应该同样适用于:
idx_lf 对于以下条件来说是最佳的:
idx_fl 将最适合以下情况:
对于许多这样的情况,可能使用两个索引,但其中一个是最佳的。例如,考虑使用 idx_lf 查询:
MySQL 可以使用 idx_lf 读取整个表,然后在
order by
之后进行过滤。我不认为这在实践中是一个优化选项(对于 MySQL),但在其他数据库中可能会发生这种情况。在讨论多列索引时,我用电话簿进行类比。电话簿基本上是先姓后名的索引。因此排序顺序是由哪个“列”在前决定的。搜索分为以下几类:
如果您查找姓氏为 Smith 的人,您可以轻松找到他们,因为这本书是按姓氏排序的。
如果您查找名字是约翰的人,电话簿没有帮助,因为约翰分散在整本书中。您必须扫描整个电话簿才能找到它们。
如果您查找具有特定姓氏史密斯和特定名字约翰的人,这本书会有所帮助,因为您会发现史密斯一家排序在一起,并且在史密斯一家中,约翰一家也按排序顺序找到.
如果您有一本按名字排序的电话簿,然后按姓氏排序,则该电话簿的排序将在上述情况#2 和#3 中为您提供帮助,但不会在情况#1 中为您提供帮助。
这解释了查找精确值的情况,但是如果您按值范围查找怎么办?假设您想要查找名字为 John、姓氏以“S”开头的所有人员(Smith、Saunders、Staunton、Sherman 等)。约翰在每个姓氏中按“J”排序,但如果您想要所有以“S”开头的姓氏的所有约翰,则约翰不会分组在一起。他们又分散了,所以你最终不得不扫描所有姓氏以“S”开头的名字。然而,如果电话簿按名字然后按姓氏进行组织,您会发现所有约翰都在一起,然后在约翰中,所有“S”姓氏将被分组在一起。
因此,多列索引中的列顺序绝对很重要。一种类型的查询可能需要索引的特定列顺序。如果您有多种类型的查询,则可能需要多个索引来帮助它们,并且列的顺序不同。
您可以阅读我的演示文稿真正如何设计索引 了解更多信息,或观看视频。