在 MySQL 中,叶子节点通常是指 B+ 树索引结构中的叶子节点。
B+ 树作为一种平衡的多路查找树,广泛用于 MySQL 的索引结构(尤其是 InnoDB 存储引擎),它通过多层次的索引树来提高查询性能。
1. B+ 树索引结构
B+ 树索引由两部分组成:
非叶子节点:用于存储索引的键(key),但不直接存储数据。它们的作用是加速查找过程。
叶子节点:存储实际的记录数据(或数据行的指针)。对于聚簇索引(InnoDB 默认索引),叶子节点包含完整的行数据;对于二级索引(非聚簇索引),叶子节点则存储指向聚簇索引的引用(即主键)。
2. 叶子节点记录之间的关联方式
B+ 树的叶子节点之间通常通过链表连接。这种链表连接使得叶子节点之间可以顺序访问,对于范围查询(如 BETWEEN
查询)特别高效。具体来说,叶子节点的每条记录之间的关联方式如下:
(1) 顺序链表连接
叶子节点中的每条记录包含了一个指向下一个叶子节点的指针。这些指针将叶子节点按索引键的顺序串联起来,形成一个顺序链表。
顺序访问:通过这个链表,MySQL 可以高效地执行范围查询(如检索一段连续的数据),直接从当前叶子节点跳到下一个叶子节点,而无需重新遍历整个树结构。
举个例子,假设有以下数据:
叶子节点1: (1, data1), (2, data2), (3, data3) 叶子节点2: (4, data4), (5, data5), (6, data6)
其中,叶子节点1的最后一条记录
(3, data3)
会指向叶子节点2的第一条记录(4, data4)
。这种链表式的连接使得扫描操作可以顺序执行。
(2) 指向数据行的指针(聚簇索引)
对于聚簇索引(InnoDB 默认索引),叶子节点中的每条记录存储的是整行数据,或者说是指向数据行的指针。在这种情况下,数据的存储与索引的存储是紧密绑定在一起的,索引的叶子节点不仅存储索引值,还存储完整的数据行。
在非聚簇索引中,叶子节点只存储主键的值(作为索引值),并且通过该主键值指向聚簇索引(主键索引)中的数据。
3. 多级链表与双向链表
在某些实现中,叶子节点之间的链表可能是双向链表,即每个叶子节点不仅有指向下一个叶子节点的指针,还可能有指向上一个叶子节点的指针。
这对于倒序扫描等操作也非常有用,可以使得范围查询更加灵活和高效。
4. 范围查询的优化
B+ 树叶子节点的链表结构对于范围查询非常有利。
例如,当你执行一个 SELECT * FROM table WHERE column BETWEEN X AND Y
查询时,MySQL 可以:
通过索引查找到符合条件的第一个叶子节点。
然后利用叶子节点之间的顺序链表连接顺序地扫描下去,直到满足查询条件的最后一个叶子节点。
这种顺序访问比传统的逐条扫描表中的记录要高效得多。
5. 总结
叶子节点的记录之间通过链表连接,这种连接是顺序的,使得范围查询非常高效。
双向链表的实现可能会用于进一步优化查询,如支持倒序扫描。
聚簇索引的叶子节点直接存储数据行,而非聚簇索引的叶子节点存储主键的引用,指向聚簇索引中的实际数据。
这种结构使得 B+ 树能够高效地执行范围查询和其他各种查询操作,同时保证了数据库在插入、删除、更新数据时的平衡性和高性能。