作者:拍友2502862603 | 来源:互联网 | 2023-09-15 03:25
篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL之B+树索引(转自掘金小册MySQL是怎样运行的,版权归作者所有!)相关的知识,希望对你有一定的参考价值。
篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL之B+树索引(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)相关的知识,希望对你有一定的参考价值。
每个索引都对应一棵B+
树,B+
树分为好多层,最下边一层是叶子节点,其余的是内节点。所有用户记录
都存储在B+
树的叶子节点,所有目录项记录
都存储在内节点。
InnoDB
存储引擎会自动为主键(如果没有它会自动帮我们添加)建立聚簇索引
,聚簇索引的叶子节点包含完整的用户记录。
我们可以为自己感兴趣的列建立二级索引
,二级索引
的叶子节点包含的用户记录由索引列 + 主键
组成,所以如果想通过二级索引
来查找完整的用户记录的话,需要通过回表
操作,也就是在通过二级索引
找到主键值之后再到聚簇索引
中查找完整的用户记录。
B+
树中每层节点都是按照索引列值从小到大的顺序排序而组成了双向链表,而且每个页内的记录(不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是联合索引
的话,则页面和记录先按照联合索引
前边的列排序,如果该列值相同,再按照联合索引
后边的列排序。
通过索引查找记录是从B+
树的根节点开始,一层一层向下搜索。由于每个页面都按照索引列的值建立了Page Directory
(页目录),所以在这些页面中的查找非常
首先我们需要知道在innoDB中一条记录的格式:
将记录格式的其他信息
去掉并把它竖起来的效果就是这样
![技术图片](https://img.php1.cn/3cd4a/189d8/b64/5b34b53b79a39fdd.jpeg)
把一些记录放到页里边的示意图就是:
![技术图片](https://img.php1.cn/3cd4a/1eebe/cd5/0d80e8a685a9a87b.png-79.8kB)
上图中的三条记录按照主键(橙色)由小到大的顺序串成一个链表
此时我们再插入一条记录,因为页10
最多只能放3条记录,所以我们不得不再分配一个新页:
![技术图片](https://img.php1.cn/3cd4a/1eebe/cd5/e88efe5b0a13a7fa.webp)
页10
中用户记录最大的主键值是5
,而页28
中有一条记录的主键值是4
,因为5 > 4
,所以这就不符合下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值的要求,所以在插入主键值为4
的记录的时候需要伴随着一次记录移动,也就是把主键值为5
的记录移动到页28
中,然后再把主键值为4
的记录插入到页10
中。我们必须通过一些诸如记录移动的操作来始终保证这个状态一直成立:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。这个过程我们也可以称为页分裂
。
其他的部分见掘金小册!