3.1.7 B+ Tree

3.1.7 B+ Tree B+ 树是 MySQL InnoDB 存储引擎的核心索引结构,所有用户表的数据和索引都组织在 B+ 树中。它是 B 树的变体,专为磁盘 I/O 和范围查询优化而设计。下面将深度剖析 InnoDB 中 B+ 树的定义、物理实现、操作细节及性能优化。🌲 一、B+ 树的定义与性质B+ 树是一种多路平衡搜索树,具有以下关键特征(与 B 树对比):特性B 树B+ 树 (InnoDB 使用)数据存储位置内部节点和叶子节点均可存放数据仅在叶子节点存放完整数据内部节点内容键 + 数据/数据指针仅键(用于导航)叶子节点连接相互独立通过双向链表串联,形成有序链表查询路径可能在内部节点直接返回所有查询必须走到叶子节点,路径等长范围查询需中序遍历,不同层间跳跃找到起始点后沿叶子链表顺序扫描,极快性质:一棵 m 阶 B+ 树,内部节点最多有m-1个键,最少有⌈m/2⌉-1个键(根节点除外)。所有叶子节点在同一层,保证绝对平衡。叶子节点包含所有键及对应的数据(聚簇索引存整行,二级索引存主键值)。🏗️ 二、InnoDB 中 B+ 树的实现:索引组织表InnoDB 使用索引组织表(Index Organized Table, IOT),即表数据按主键顺序以 B+ 树形式存储。1. 聚簇索引 (Clustered Index)以主键为索引键构建的 B+ 树。叶子节点直接存储该行的全部列值。逻辑上,表就是一个聚簇索引。若未定义主键,InnoDB 会选择第一个唯一非空索引;若无,则自动生成 6 字节隐藏列row_id作为聚簇索引。2. 二级索引 (Secondary Index)以非主键列(或组合)构建的 B+ 树。叶子节点存储索引键值 +对应主键值。通过二级索引查询需要回表:先找到主键,再到聚簇索引中查找整行。如果索引覆盖所有查询列,则无需回表,称为覆盖索引。结构示意图: