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)
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的文档才能获得真实的信息.