组合索引如何工作?
我已经在表格上创build了复合索引( 索引为你的math民谣),并假设它们是如何工作的。 我只是好奇,如果我的假设是正确的或不。
我假设当你列出索引列的顺序时,你也指定了索引如何分组。 例如,如果您有列a
, b
和c
,并且按照相同的顺序指定索引a ASC
, b ASC
和c 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单独的索引。