组合索引如何工作?

我已经在表格上创build了​​复合索引( 索引为你的math民谣),并假设它们是如何工作的。 我只是好奇,如果我的假设是正确的或不。

我假设当你列出索引列的顺序时,你也指定了索引如何分组。 例如,如果您有列abc ,并且按照相同的顺序指定索引a ASCb ASCc ASC则结果索引本质上将是a每个“组”的许多索引。

它是否正确? 如果没有,那么结果指数究竟是什么样子呢?

复合索引就像常规索引一样工作,除了它们有多值键。

如果在字段(a,b,c)上定义了一个索引,则logging首先在a,b和c上sorting。

例:

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

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

 AA - page 1 AB - page 12 

等等

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

当您通过两列或第一列进行search时,它是可用的。 如果你的索引是这样的:

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

你可以使用它来search2字母( = 2表中的= 2列),或者像一个字母上的简单索引:

 A - page 1 B - page 246 … 

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

在一个普通的非CLUSTERED索引中,对页面的引用是按照历史logging中的顺序排列的:

 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子句的文章:

  • 降序索引

索引最常见的实现是使用B树来进行一些快速的查找,还有合理的快速范围扫描。 这里解释太多了,但这里是关于B-tree的维基百科文章。 而且你是对的,你在创build索引中声明的第一列将是生成的B-树中的高阶列。

对高阶列的search相当于一个范围扫描,而B树索引对于这样的search可能非常有用。 最简单的方法是通过比较库中旧卡目录中尚未转换为在线目录的types。

如果您正在寻找姓氏为“Clemens”的作者的所有卡片,只需转到作者目录,然后很快find一个在前面写上“CLE- CLI”的抽屉。 这是正确的抽屉。 现在你在那个抽屉里做一个非正式的二进制search,快速find所有的“Clemens,Roger”或者“Clemens,Samuel”的卡片。

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

不同的DBMS在优化器在检测索引范围扫描方面的聪明程度不同,并准确估计其成本。 并不是所有的指数都是B树。 您必须阅读您的特定DBMS的文档才能获得真实的信息。

结果索引是单索引,但是是复合键。

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

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

所以,如果你需要通过KeyX KeyYfind一些东西 – 这将是快速的,将使用单一的索引。 像SELECT … WHERE KeyX =“B”和KeyY = 3。

但重要的是要明白:WHERE KeyX =? 请求使用该索引,而WHERE KeyY =? 根本不会使用这样的索引。

我的理解是,复合索引就像常规索引一样工作,除了它们有多值键。 如果你在字段(a,b,c)上定义了一个索引,那么由于复合索引将被存储在一个BinaryTree中,所以你的索引只能在search组合后才起作用。

 ABC AB A 

例如,为a,b和c字段创build组合索引等同于为a,ab和abc创build单独的索引。