复合索引如何工作?

时间:2009-04-27 19:53:57

标签: sql indexing composite

我已经在表上为表格创建了复合索引( indices ),然后假设它们是如何工作的。如果我的假设是正确的,我只是好奇。

我假设在列出索引的列顺序时,您还要指定索引的分组方式。例如,如果您有列abc,则可以按相同的顺序a ASCb ASC和{{ 1}}然后结果索引基本上是c ASC中每个“组”的许多索引。

这是对的吗?如果不是,结果索引究竟会是什么样的?

5 个答案:

答案 0 :(得分:66)

复合索引的工作方式与常规索引类似,但它们具有多值键。

如果在字段(a,b,c)上定义索引,则记录首先在a上排序,然后是b,然后是c。

示例:

| A | B | C |
-------------
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 4 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 5 |

答案 1 :(得分:30)

复合索引就像字典中的普通字母索引,但是包含两个或更多字母,如下所示:

AA - page 1
AB - page 12

表行首先按索引中的第一列排序,然后按第二列排序等。

当您按两列或第一列搜索时,它可用。如果您的索引是这样的:

AA - page 1
AB - page 12
…
AZ - page 245
BA - page 246
…

您可以使用它来搜索表格中的2个字母(= 2列),或者像一个字母上的普通索引一样:

A - page 1
B - page 246
…

请注意,在字典的情况下,页面本身按字母顺序排列。这是CLUSTERED索引的一个例子。

在简单的非CLUSTERED索引中,对页面的引用是有序的,就像在历史书中一样:

Gaul, Alesia: pages 12, 56, 78
Gaul, Augustodonum Aeduorum: page 145
…
Gaul, Vellaunodunum: page 24
Egypt, Alexandria: pages 56, 194, 213, 234, 267

当您ORDER BY两列或更多列时,也可以使用复合索引。在这种情况下,DESC条款可能会派上用场。

在我的博客中查看有关在复合索引中使用DESC子句的文章:

答案 2 :(得分:17)

最常见的索引实现使用B树来实现快速查找,并且还可以进行相当快速的范围扫描。这里解释得太多了,但这里是关于B-trees的维基百科文章。你是对的,你在create index中声明的第一列将是生成的B树中的高阶列。

对高阶列的搜索相当于范围扫描,而B树索引对于此类搜索非常有用。最简单的方法是使用尚未转换为在线目录的库中的旧卡目录。

如果您正在寻找姓氏为“Clemens”的作者的所有卡片,您只需转到作者目录,并很快找到前面标有“CLE-CLI”的抽屉。那是正确的抽屉。现在你在那个抽屉里进行一种非正式的二元搜索,快速找到所有说“Clemens,Roger”或“Clemens,Samuel”的牌。

但是假设您想为名字为“Samuel”的作者找到所有卡片。现在你已经上了小溪,因为这些卡片并没有聚集在作者目录中的一个地方。数据库中的复合索引也会出现类似现象。

不同的DBMS在优化器检测索引范围扫描时的巧妙程度以及准确估算其成本方面存在差异。并非所有指数都是B树。您必须阅读特定DBMS的文档才能获得真实的信息。

答案 3 :(得分:4)

没有。结果索引将是单个索引,但使用复合键。

KeyX = A,B,C,D; KeyY = 1,2,3,4;

Index KeyX,KeyY实际上是:A1,A2,A3,B1,B3,C3,C4,D2

因此,如果你需要通过KeyX KeyY找到一些东西 - 这将是快速的并将使用单个索引。像SELECT ... WHERE KeyX =“B”AND KeyY = 3。

但重要的是要理解:WHERE KeyX =?请求使用该索引,而WHERE KeyY =?将 NOT 完全使用此类索引。

答案 4 :(得分:0)

我的理解是,复合索引就像常规索引一样工作,除了它们有多值键。如果您在字段(a,b,c)上定义索引,由于复合索引将存储在BinaryTree中,因此您的索引仅适用于搜索组合。

ABC
AB
A

例如,为a,b和c字段创建复合索引相当于为a,ab和abc创建单独的索引。