MySQL 中多列索引中的字段顺序重要吗?
P粉002023326
P粉002023326 2023-10-21 22:05:44
0
2
583

我知道索引的重要性以及连接顺序如何改变性能。我已经阅读了大量与多列索引相关的内容,但没有找到我的问题的答案。

我很好奇,如果我做一个多列索引,它们指定的顺序是否重要。我的猜测是不会,并且引擎会将它们视为一个组,其中顺序并不重要。但我想验证一下。

例如,来自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)

P粉002023326
P粉002023326

全部回复(2)
P粉317679342

两个索引不同。这在 MySQL 和其他数据库中都是如此。 MySQL 在文档中解释了不同之处.

考虑两个索引:

create index idx_lf on name(last_name, first_name);
create index idx_fl on name(first_name, last_name);

这两者应该同样适用于:

where last_name = XXX and first_name = YYY

idx_lf 对于以下条件来说是最佳的:

where last_name = XXX
where last_name like 'X%'
where last_name = XXX and first_name like 'Y%'
where last_name = XXX order by first_name

idx_fl 将最适合以下情况:

where first_name = YYY
where first_name like 'Y%'
where first_name = YYY and last_name like 'X%'
where first_name = XXX order by last_name

对于许多这样的情况,可能使用两个索引,但其中一个是最佳的。例如,考虑使用 idx_lf 查询:

where first_name = XXX order by last_name

MySQL 可以使用 idx_lf 读取整个表,然后在 order by 之后进行过滤。我不认为这在实践中是一个优化选项(对于 MySQL),但在其他数据库中可能会发生这种情况。

P粉899950720

在讨论多列索引时,我用电话簿进行类比。电话簿基本上是先姓后名的索引。因此排序顺序是由哪个“列”在前决定的。搜索分为以下几类:

  1. 如果您查找姓氏为 Smith 的人,您可以轻松找到他们,因为这本书是按姓氏排序的。

  2. 如果您查找名字是约翰的人,电话簿没有帮助,因为约翰分散在整本书中。您必须扫描整个电话簿才能找到它们。

  3. 如果您查找具有特定姓氏史密斯和特定名字约翰的人,这本书会有所帮助,因为您会发现史密斯一家排序在一起,并且在史密斯一家中,约翰一家也按排序顺序找到.

如果您有一本按名字排序的电话簿,然后按姓氏排序,则该电话簿的排序将在上述情况#2 和#3 中为您提供帮助,但不会在情况#1 中为您提供帮助。

这解释了查找精确值的情况,但是如果您按值范围查找怎么办?假设您想要查找名字为 John、姓氏以“S”开头的所有人员(Smith、Saunders、Staunton、Sherman 等)。约翰在每个姓氏中按“J”排序,但如果您想要所有以“S”开头的姓氏的所有约翰,则约翰不会分组在一起。他们又分散了,所以你最终不得不扫描所有姓氏以“S”开头的名字。然而,如果电话簿按名字然后按姓氏进行组织,您会发现所有约翰都在一起,然后在约翰中,所有“S”姓氏将被分组在一起。

因此,多列索引中的列顺序绝对很重要。一种类型的查询可能需要索引的特定列顺序。如果您有多种类型的查询,则可能需要多个索引来帮助它们,并且列的顺序不同。

您可以阅读我的演示文稿真正如何设计索引 了解更多信息,或观看视频

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!