文章目录
- MySQL索引:B+树与页的深度解析
-
- [1. 索引使用的数据结构------B+树](#1. 索引使用的数据结构——B+树)
-
- [1.1 B+树介绍](#1.1 B+树介绍)
- [1.2 B+树的特点](#1.2 B+树的特点)
- [1.3 B+树和B树的对比](#1.3 B+树和B树的对比)
- [2. MySQL中的页](#2. MySQL中的页)
-
- [2.1 页的介绍](#2.1 页的介绍)
- [2.2 页主体](#2.2 页主体)
- [2.3 页目录](#2.3 页目录)
- [2.4 B+树在MySQL索引中的应用](#2.4 B+树在MySQL索引中的应用)
MySQL索引:B+树与页的深度解析
在MySQL数据库中,索引扮演着至关重要的角色,它作为一种数据结构,极大地助力了数据库在查询、存储及更新数据时的高效运作。鉴于在数据库操作里,查询的频率远远高于增删改的频率,索引的核心作用便在于提升数据检索的效率。
1. 索引使用的数据结构------B+树
1.1 B+树介绍
B+树是一种在数据库与文件系统等领域广泛应用的平衡查找树。以下是一个3阶B+树的示例图:
1.2 B+树的特点
结合上述图示,我们能够归纳出B+树具备以下特点:
- 数据有序性与操作复杂度:B+树能够维持数据的稳定有序,无论是插入还是修改操作,其时间复杂度均保持一致。
- 节点存储特性:非叶子节点仅承担索引功能,并不存储实际数据,而所有的叶子节点则负责保存真实的数据。
- 叶子节点链表结构:所有的叶子节点共同构成了一个有序链表,借助这一链表,可以依据排序次序依次遍历全部数据。
1.3 B+树和B树的对比
B树的结构如下图所示:
通过与B树对比,我们可以明晰B+树所具有的独特特点:
- 节点值包含关系:在B+树中,非叶子节点的值涵盖于叶子节点之中。
- 叶子节点数据连续性:B+树的叶子节点数据呈现连续且相互链接的状态,这一特性使得区间查找与搜索更为便捷。
- 性能均衡性:在树高相同的前提下,B+树查找任意元素的时间复杂度恒定,性能表现更为均衡。
2. MySQL中的页
2.1 页的介绍
- 数据存储位置:数据库中的数据存储于磁盘之上。
- 页内地址连续性:磁盘中每个页内部的地址是连续的。
- 页的作用与大小:页是内存与磁盘交互的最小单元,默认大小为16KB。即便某一页没有数据,也会占用16KB的存储空间,并且页与索引的B+树节点相对应。
在MySQL中存在多种类型的页,其中最常用的便是用于存储数据和索引的"数据页"或"索引页"。无论何种类型的页,都具备"页头"与"页尾",页的主体信息则由"数据行"填充。
"数据页"的基本结构如下图所示:
由于页头包含上一页和下一页的页号,借助这两个属性,能够将页与页连接起来,形成一个双向链表。
2.2 页主体
每当创建一个新页时,系统会自动分配两行,一行代表页内最小行,另一行代表页内最大行。这两行并不存储实际信息,而是作为数据行链表的起始与结束标志。
当插入数据时,数据会被插入到最小行与最大行之间,并按照主键从小到大的顺序进行链接。
2.3 页目录
当一个页中存储的数据量过多时,查找数据会变得繁琐。为提升查找效率,InnoDB采用二分查找的方式来解决这一问题。
具体实现方式为创建一个页目录,将页内所有行进行分组,分组规则如下:
- 头行(最小行)单独作为一组。
- 其余行按照顺序分组,每组最多8条数据。
页目录中的一个槽对应一个分组,每组的最后一行地址会被记录在槽中。如此一来,在查找某行数据时,可先通过二分查找确定对应的槽,再在槽所对应的组中进行遍历,从而显著提高查询效率。
2.4 B+树在MySQL索引中的应用
在MySQL索引中,B+树的非叶子节点保存索引数据,叶子节点保存真实数据,如下表所示:
以下以查找"主键 = 3"为例,简要阐述其查找过程:
- 在索引页1中:由于3 < 7,所以进入索引页2。
- 在索引页2中:因为3 <= 3 < 5,进而进入数据页2。
- 在数据页中执行二分查找(依据分组的槽),确定对应的槽。
- 在对应的组中进行遍历,最终获取到数据。