结合前面
student表、聚簇索引 / 前缀二级索引 实例,讲解 B + 树构建规则、分步流程、节点分裂,配套可视化结构,适配考试 + 实操。一、B + 树核心规则(InnoDB 标准,必背)
以多路平衡查找树为基础,针对索引优化:
- 所有数据仅存于叶子节点 ,非叶子节点只存索引关键字 + 子节点指针,仅用来引路。
- 节点关键字有序排列,整棵树全局有序。
- 所有叶子节点用双向链表串联,支持范围查询。
- 非叶子节点关键字 = 下层子树的分界值。
- 节点满了会节点分裂,向上更新父节点,保证树平衡。
InnoDB 索引页默认大小 16KB,一个节点可存放大量关键字,树层数极低(一般 2~4 层)。
二、以【聚簇索引】为例完整构建 B + 树
沿用示例表,主键
sid作为排序键,数据:sid:1、2、3、4、5、61. 设定规则(简化演示)
为方便画图,约定:
- 每个节点最多存放 3 个关键字
- 超出容量触发节点分裂
2. 分步插入 & 构建过程
第 1 步:插入 1
树为空,新建叶子节点:
plaintext
叶子节点:[1]第 2 步:插入 2
直接追加到同一叶子节点(未满):
plaintext
叶子节点:[1, 2]第 3 步:插入 3
节点达到最大容量
3:plaintext
叶子节点:[1, 2, 3]第 4 步:插入 4 → 触发叶子节点分裂
原叶子已满,一分为二:
- 原节点保留左半部分:
[1, 2]- 新建右侧叶子节点:
[3, 4]- 取中间值
3上升,创建根非叶子节点存储分界值。当前结构:
plaintext
根节点(非叶子) [3] ↙ ↘ 叶子[1,2] 叶子[3,4]第 5 步:插入 5
追加到右侧叶子
[3,4],节点满:plaintext
[3] ↙ ↘ [1,2] [3,4,5]第 6 步:插入 6 → 再次分裂
右侧叶子已满,再次分裂:
- 拆分
[3,4,5]→ 左[3,4]、右[5,6]- 中间值
5向上合并到根节点。最终成型 B + 树(聚簇索引)
plaintext
根节点(非叶子) [3, 5] ↙ ↓ ↘ 叶子[1,2] 叶子[3,4] 叶子[5,6]补充说明
- 所有 sid 数据行 都保存在叶子节点中;
- 非叶子节点
[3,5]只是分界值,不存完整数据;- 三个叶子节点通过双向链表相连,有序排列。
三、以【前缀二级索引】构建 B + 树(sname 前 2 字符)
索引:
sname(2),存储内容:前缀字符 + 主键 sid 数据前缀排序:(张三,1)、(张三,2)、(张小,3)、(李四,4)、(李磊,5)、(王五,6)同样约定:单节点最多存 3 条索引项。
分步构建
依次插入
(张三,1)、(张三,2)、(张小,3)叶子节点存满:[(张三,1), (张三,2), (张小,3)]插入第 4 条
(李四,4)→ 叶子分裂
- 左叶子:
[(张三,1), (张三,2)]- 右叶子:
[(张小,3), (李四,4)]- 中间分界值
张小上升为根节点plaintext
根节点 [张小] ↙ ↘ 左叶子 右叶子 [张三,1] [张小,3] [张三,2] [李四,4]
- 继续插入
(李磊,5)、(王五,6)右侧叶子填满后再次分裂,最终结构:plaintext
根节点 [张小, 李磊] ↙ ↓ ↘ 叶子组1 叶子组2 叶子组3 (张三,1) (张小,3) (李磊,5) (张三,2) (李四,4) (王五,6)二级索引 B + 树特点
- 叶子:
(前缀字符, 主键sid),无整行数据;- 非叶子:仅分界前缀字符;
- 查询后必须回表。
四、节点分裂核心逻辑(考点)
- 向节点插入关键字,节点已满 → 触发分裂;
- 将当前节点数据从中间一分为二;
- 中间位置的关键字向上提升到父节点;
- 父节点如果也满,继续向上分裂,直到根节点;
- 根节点分裂 → 树层数 + 1。
B + 树 自平衡,插入 / 删除后自动维护结构,不会变成斜树。
五、B + 树 与 B 树 构建区别(简答考点)
- B 树:所有节点(含非叶子)都存储数据 + 关键字;
- B + 树 :仅叶子节点存数据,非叶子只做索引分界;
- B + 树非叶子节点更小、能存放更多分界值,树层数更少、IO 更少;
- B + 树叶子链表,范围查询远优于 B 树。
六、考试标准简答题答案
1. B + 树构建过程
按照关键字大小升序依次插入节点;节点存满后从中间分裂,中间关键字上浮至父节点作为分界值;重复该过程直至所有数据插入完成。所有业务数据仅保存在叶子节点,非叶子节点只存储分界关键字用于检索,叶子节点通过双向链表串联,最终形成多路平衡 B + 树。
2. InnoDB 索引为什么选用 B + 树
B + 树非叶子节点不存储数据,节点容量大,树高度低,磁盘 IO 次数少;叶子节点有序链表,等值查询、范围查询效率高,非常适合数据库索引场景。
七、总结(串联之前知识点)
- 聚簇索引:以主键 为关键字构建 B + 树,叶子存整行数据;
- 二级 / 前缀索引:以索引字段 为关键字构建 B + 树,叶子存索引值 + 主键;
- 查找流程:二级索引 B + 树 → 拿到主键 → 回表 → 聚簇索引 B + 树 → 取完整数据;
- 构建核心:有序插入 + 节点分裂 + 分层存储。
MySQL—B+树构建
XZ-0700012026-06-03 14:23
相关推荐
XZ-0700011 小时前
MySQL-综合应用(Python+Html)he___H1 小时前
B、B+树和vue部分知识XZ-0700011 小时前
MySQL-聚簇索引qq_185198691 小时前
ruoyi框架中配置minioAccess开发易登软件1 小时前
Access 用 VBA 操作 SQLite,不用装任何驱动字节跳动数据库2 小时前
火山引擎 Milvus 发布官方 CLI + Skill ,终端与对话双通道掌控向量数据库夜白宋2 小时前
【Redis深入】一、快的原因念越2 小时前
【数据库系统概论期末复习】 绪论重点与常考题重点与常考题整理第一章SXJR2 小时前
langchain4j是如何保证tools或者funcation call不出错的