复合索引如何工作?

Joe*_*ips 61 sql indexing composite

我已经在表格上创建了复合索引(数学民间的索引),并假设它们是如何工作的.如果我的假设是正确的,我只是好奇.

我假设当您列出索引的列顺序时,您还要指定索引的分组方式.举例来说,如果你有列a,b以及c和您指定的指数相同的顺序a ASC,b ASC以及c ASC随后产生的指数基本上将许多指标在每一个"组" a.

它是否正确?如果不是,结果索引实际上会是什么样子?

Rik*_*Rik 71

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

如果在字段(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 |
Run Code Online (Sandbox Code Playgroud)

  • 请注意,索引存储为Btree,因此(a,b,c)索引将有助于搜索(a)和(a,b),但*不*用于其他搜索,如(b)或(公元前). (18认同)

Qua*_*noi 31

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

AA - page 1
AB - page 12
Run Code Online (Sandbox Code Playgroud)

等等

表行首先由索引中的第一列排序,然后由第二列排序.

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

AA - page 1
AB - page 12
…
AZ - page 245
BA - page 246
…
Run Code Online (Sandbox Code Playgroud)

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

A - page 1
B - page 246
…
Run Code Online (Sandbox Code Playgroud)

请注意,在字典的情况下,页面本身按字母顺序排列.这是一个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
Run Code Online (Sandbox Code Playgroud)

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

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


Wal*_*tty 17

最常见的索引实现使用B树来允许稍微快速的查找,以及相当快速的范围扫描.这里解释得太多了,但这里是关于B树的维基百科文章.你是对的,你在create index中声明的第一列将是生成的B树中的高阶列.

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

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

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

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