当前位置: 首页 > 面试题库 >

MySQL的多列索引的字段顺序是否重要

汝弘深
2023-03-14
问题内容

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

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

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

问题答案:

在讨论多列索引时,我使用类似于电话簿的方法。电话簿基本上是姓氏,然后是名字的索引。因此,排序顺序由第一个“列”确定。搜索分为以下几类:

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

  2. 如果您查找名字叫John的人,则电话簿无济于事,因为Johns散布在整个电话簿中。您必须扫描整个电话簿才能找到全部内容。

  3. 如果您查找具有特定姓氏Smith和特定名字John的人,这本书会有所帮助,因为您发现Smiths排序在一起,并且在该Smiths组中,Johns也按排序顺序找到。

如果您的电话簿是按名字排序,然后按姓氏排序,那么在上述情况#2和#3中,但在情况#1中,电话簿的分类将对您有帮助。

这就解释了查找精确值的情况,但是如果您要按值范围查找怎么办?假设您想查找所有姓氏为John且姓氏以’S’开头的人(史密斯,桑德斯,斯坦顿,谢尔曼等)。约翰在每个姓氏中的’J’下排序,但是如果您希望所有以’S’开头的姓氏都包含约翰,那么约翰就不会分组在一起。它们又被分散了,所以您最终不得不浏览所有以’S’开头的姓氏。而如果电话簿是按照名字然后按照姓氏来组织的,那么您会发现所有的John在一起,然后在John内将所有“
S”姓氏组合在一起。

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

您可以阅读我的演示“如何设计索引”,了解更多信息。



 类似资料:
  • 问题内容: Elasticsearch是否保持多值字段的顺序? 即,如果我在字段中输入了以下值: (鉴于未分析字段) 我是否可以确定列表的内容将始终按照与放置列表相同的顺序返回? 在上面的示例中,我想确保“值”中第一个位置的“一个”将始终与“ values_original”等中的“ 1”相对应。 我也可以将其保留为嵌套对象,即 但我想避免开销。 如果可以保证保留多值字段中的值顺序,那么我保留两个

  • 问题内容: 这是我永远遇到的一个问题。 据我所知,索引的顺序很重要。因此,类似的索引与 并不相同,对吧? 如果我仅定义第一个索引,是否意味着它将仅用于 而不是 由于我使用的是ORM,所以我不知道这些列的调用顺序。这是否意味着我必须在所有排列上添加索引?如果我有2列索引,那是可行的,但是如果我的索引是3列或4列怎么办? 问题答案: 当查询条件仅适用于 部分 索引时,索引顺序很重要。考虑: 如果你的索

  • 在 FreeMarker 2.3.23 中,指令名可以使用驼峰样式来代替蛇形样式, 比如 startsWith 代替 starts_with。 但是要知道,在相同模版内,FreeMarker 会强制对模板语言部分的所有标识符使用驼峰样式 (用户自定义名称不会受影响)。 abs ancestors api boolean byte c for strings, for booleans cap_fi

  • $ ${...},  插值 # #,  总体结构, 指令 #{...},  #{...}: 数字插值 < <#...>,  指令 <#--...-->,  总体结构 A ABC,  lower_abc, upper_abc abs built-in,  abs absolute value,  abs acquisition,  使用获得机制 adding hashes,  连接 adding s

  • 问题内容: 我在表中有两个索引字段- 和(单个索引,不是复合索引)。 的字段值非常有限(假设它仅为0或1),因此50%的表记录具有相同的。另一方面,值来自更大的集合,因此具有相同值的记录量很小。 这些查询中的任何一个都会比另一个查询运行得更快吗? 另外,如果两个字段都没有索引,是否会改变行为? 问题答案: SQL被设计为一种声明性语言,而不是一种过程性语言。因此,查询优化器应该 不会 考虑在决定如

  • 问题内容: MySQL是否自动索引外键列? 问题答案: 是的,但仅在innodb上。Innodb是当前唯一实现了外键的表格式。