第六章 快速查询(索引)

索引—每个页的目录项

每个目录项包含两个部分
·⻚的⽤户记录中最⼩的主键值,我们⽤key来表示。
·⻚号,我们⽤page_no表示。
image.png

B+树和聚簇索引

B+树的叶⼦节点存储的是完整的⽤户记录。

具有下面特性的B+树 称为聚簇索引
image.png
0:普通的⽤户记录
1:⽬录项记录
2:最⼩记录
3:最⼤记录

二级索引

上面的聚簇索引时根据 主键搜索, 而根据其他的条件搜索就称为二级索引
原理上还是B+树,只不过搜索条件不是根据主键罢了

区别:
B+树的叶⼦节点存储的并不是完整的⽤户记录,⽽只是c2列+主键这两个列的值。
⽬录项记录中不再是主键+⻚号的搭配,⽽变成了c2列+⻚号的搭配。

联合索引

我们也可以同时以多个列的⼤⼩作为排序规则,也就是同时为多个列建⽴索引,⽐⽅说我们想让B+树按照c2和c3列的⼤⼩进⾏排序,这个包含两层含义:
先把各个记录和⻚按照c2列进⾏排序。
在记录的c2列相同的情况下,采⽤c3列进⾏排序
为c2和c3列建⽴的索引的示意图如下:

image.png

总结

1. 对于InnoDB存储引擎来说,在单个⻚中查找某条记录分为两种情况:
以主键为搜索条件,可以使⽤Page Directory通过⼆分法快速定位相应的⽤户记录。
以其他列为搜索条件,需要按照记录组成的单链表依次遍历各条记录。

2. 没有索引的情况下,不论是以主键还是其他列作为搜索条件,只能沿着⻚的双链表从左到右依次遍历各个⻚。

3. InnoDB存储引擎的索引是⼀棵B+树,完整的⽤户记录都存储在B+树第0层的叶⼦节点,其他层次的节点都属于内节点,内节点⾥存储的是⽬录项记录。InnoDB的索引分为两⼤种:

聚簇索引
以主键值的⼤⼩为⻚和记录的排序规则,在叶⼦节点处存储的记录包含了表中所有的列。

⼆级索引
以⾃定义的列的⼤⼩为⻚和记录的排序规则,在叶⼦节点处存储的记录内容是列 + 主键。

4. MyISAM存储引擎的数据和索引分开存储,这种存储引擎的索引全部都是⼆级索引,
在叶⼦节点处存储的是列 + ⻚号。