作为计算机学习者,B+树是数据库索引的核心基石 ,本文基于经典B+树教程,深度拆解原理、实操规则、MySQL底层应用,补充行业常用扩展知识点,让你零基础吃透B+树,做到学完即用、实战懂优化。
文章目录
-
- 一、B+树基础:通俗理解+核心特性
-
- [1.1 生活化类比:一眼懂B+树](#1.1 生活化类比:一眼懂B+树)
- [1.2 B+树4大核心特性](#1.2 B+树4大核心特性)
- 二、B+树硬性规则:阶数m是核心
-
- [2.1 核心公式](#2.1 核心公式)
- [2.2 常用阶数实战](#2.2 常用阶数实战)
- 三、B+树核心操作:查找、插入、删除
-
- [3.1 查找规则:](#3.1 查找规则:)
- [3.2 插入操作:满就分裂(平衡核心)](#3.2 插入操作:满就分裂(平衡核心))
- [3.3 删除操作:少了就合并(禁止空分支)](#3.3 删除操作:少了就合并(禁止空分支))
- 四、B+树易错细节
- 五、MySQL为什么必用B+树?(底层淘汰逻辑)
- [六、MySQL InnoDB索引底层实战](#六、MySQL InnoDB索引底层实战)
-
- [6.1 InnoDB页:B+树的存储单元](#6.1 InnoDB页:B+树的存储单元)
- [6.2 聚簇索引(主键索引)](#6.2 聚簇索引(主键索引))
- [6.3 二级索引(普通索引)](#6.3 二级索引(普通索引))
- [6.4 回表与覆盖索引(索引优化核心)](#6.4 回表与覆盖索引(索引优化核心))
- [6.5 联合索引与最左前缀原则](#6.5 联合索引与最左前缀原则)
- 七、索引实战:优缺点+失效场景+优化
-
- [7.1 索引优缺点](#7.1 索引优缺点)
- [7.2 索引失效场景](#7.2 索引失效场景)
- [7.3 索引优化小技巧](#7.3 索引优化小技巧)
- 八、扩展知识点:当今行业常用
-
- [8.1 B树 vs B+树](#8.1 B树 vs B+树)
- [8.2 MyISAM与InnoDB索引差异](#8.2 MyISAM与InnoDB索引差异)
- [8.3 千万级数据B+树层数计算](#8.3 千万级数据B+树层数计算)
- [8.4 索引下推(ICP)](#8.4 索引下推(ICP))
- 九、全文总结
一、B+树基础:通俗理解+核心特性
1.1 生活化类比:一眼懂B+树
把数据库表 比作厚字典 ,索引 就是字典的目录 ,而B+树 就是目录的排版结构:
- 无索引:查数据=逐页翻字典(全表扫描,效率极低)
- 有B+树索引:最多3-4层目录直接定位(索引查询,毫秒级响应)
1.2 B+树4大核心特性
- 叶子节点全在同一层:这是B+树唯一的平衡标准,和AVL树、红黑树的「高度差平衡」完全不同。
- 非叶子节点只存索引:不存储真实数据,最大化节点容量,让树更矮。
- 叶子节点双向链表相连 :天然支持范围查询 (如
>、<、between、order by)。 - 天然平衡:无论数据怎么增删,永远不会变成斜树,性能稳定。
二、B+树硬性规则:阶数m是核心
B+树的所有操作(插入、删除、分裂)都围绕阶数m展开,这是节点的「容量规格」,题目/数据库会直接指定。
2.1 核心公式
- 单个节点最大关键字数 :
m-1 - 单个节点最大子节点数 :
m - 单个节点最小关键字数 :
⌈m/2⌉ - 1(向上取整,禁止空节点)
2.2 常用阶数实战
- 3阶B+树(学习/考试首选):最大2个关键字、最少1个关键字、最多3个子节点
- 4阶B+树(数据库简化模型):最大3个关键字、最少1个关键字、最多4个子节点
铁律 :B+树绝对不允许空节点、空分支,子节点数永远 = 关键字数 + 1。
三、B+树核心操作:查找、插入、删除
3.1 查找规则:
超级口诀 :小于往左,等于靠右,大于继续右
案例:非叶子节点[2,4]
- 目标<2 → 走最左子节点
- 2≤目标<4 → 走中间子节点
- 目标≥4 → 走最右子节点
3.2 插入操作:满就分裂(平衡核心)
插入流程固定不变,递归执行:
- 节点关键字超过最大容量 → 触发分裂
- 中间关键字上浮到父节点
- 原节点拆分为左右两部分
- 父节点若满,继续递归分裂
大坑避坑 :上浮的关键字不属于叶子节点数据 ,不会重复计数!
案例:3阶B+树叶子[3,3]插入3 → 溢出后中间3上浮,叶子各留1个3,父节点再分裂。
3.3 删除操作:少了就合并(禁止空分支)
删除流程:先借→后合并,绝不留空节点
- 删除后关键字≥最小值 → 直接保留
- 删除后关键字<最小值 → 先向兄弟节点借,借不到就合并
- 合并后删除空分支,保证子节点数=关键字数+1
案例:删除叶子[5,6]中的6 → 变为[5],直接删除空右分支,不保留空节点。
四、B+树易错细节
- 平衡只看叶子是否同层,无高度差概念。
- 无空节点、无空分支,子节点数=关键字数+1。
- 重复值可正常存储,塞满照样分裂。
- 上浮关键字不占用叶子数据,切勿重复计算。
- 查找时等于必须靠右,固定规则。
- 树长高的唯一方式:根节点分裂。
- 删除永远先借后合并,不残留空节点。
五、MySQL为什么必用B+树?(底层淘汰逻辑)
数据库索引的核心需求:少磁盘IO、支持范围查询、性能稳定,B+树是唯一满足所有需求的结构:
| 数据结构 | 淘汰原因 |
|---|---|
| 二叉树 | 易变斜树,数据越多树越高,磁盘IO爆炸 |
| 红黑树 | 树高、单节点存数据少,不适合磁盘+范围查询 |
| 哈希索引 | 仅支持等值查询,不支持>、<、order by |
B+树适配磁盘的3大优势
- 节点超大、树极矮:千万级数据仅3-4层,IO次数极少。
- 叶子链表有序:范围查询、排序天生高效。
- 非叶子不存数据:节点能存更多索引,进一步降低树高。
六、MySQL InnoDB索引底层实战
InnoDB是MySQL默认存储引擎,索引完全基于B+树实现,这是后端开发必懂的实战知识点。
6.1 InnoDB页:B+树的存储单元
- InnoDB默认页大小16KB ,B+树的1个节点 = 1个页。
- 1页能存上千个索引,所以B+树层数极低,查询极快。
6.2 聚簇索引(主键索引)
- 一张表仅有1个聚簇索引。
- 叶子节点存储整行数据 ,整张表就是一棵B+树。
- 无主键时,InnoDB会自动生成隐藏主键作为聚簇索引。
6.3 二级索引(普通索引)
- 手动创建的索引(如单列、联合索引)。
- 叶子节点只存储主键值,不存整行数据。
- 查询非索引字段时,需要回表。
6.4 回表与覆盖索引(索引优化核心)
- 回表:二级索引找到主键 → 再去聚簇索引查整行数据(多一次IO,效率低)。
- 覆盖索引 :查询的字段全部在索引中,无需回表(索引查询最优解)。
6.5 联合索引与最左前缀原则
联合索引(a,b,c)的排序规则:a→b→c,遵循最左前缀匹配:
- 能走索引:
a、a,b、a,b,c - 不能走索引:
b、c、a,c(跳字段失效)
七、索引实战:优缺点+失效场景+优化
7.1 索引优缺点
- 优点:极速查询、减少IO、提升排序/分组/连表效率。
- 缺点:占用磁盘空间、增删改变慢(需维护B+树)、索引不是越多越好。
7.2 索引失效场景
- 左模糊查询:
like %xxx - 索引列使用函数:
func(index_col) - 隐式类型转换:字符串索引不加引号
- 违反最左前缀原则
- 数据重复率过高,优化器自动放弃索引
7.3 索引优化小技巧
- 优先建立联合索引,避免冗余单列索引。
- 用覆盖索引避免回表。
- 不为低基数列(如性别)建索引。
- 禁止过度索引,降低写入性能损耗。
八、扩展知识点:当今行业常用
8.1 B树 vs B+树
- B树:非叶子节点存数据,叶子无链表,不支持范围查询。
- B+树:非叶子不存数据,叶子链表,范围查询强,数据库首选。
8.2 MyISAM与InnoDB索引差异
- MyISAM:非聚簇索引,叶子节点存数据地址,索引和数据分离。
- InnoDB:聚簇索引,叶子存整行数据,索引即数据。
8.3 千万级数据B+树层数计算
- 16KB页,索引8字节,指针6字节 → 1页存约1170个索引。
- 叶子存10条数据 → 11701170 10 ≈ 1300万数据,仅3层B+树。
8.4 索引下推(ICP)
MySQL 5.6+优化技术,在索引层直接过滤数据,减少回表次数,提升范围查询效率。
九、全文总结
- B+树靠分裂+合并平衡,唯一标准:所有叶子同层。
- 节点有严格容量,禁止空节点、空分支。
- 查找口诀:小于往左,等于靠右,大于继续右。
- 上浮关键字不计入叶子数据,避免重复计数。
- InnoDB 16KB页适配B+树,千万数据仅3-4层。
- 聚簇索引存整行,二级索引存主键,查*需回表。
- 索引加速查询、拖慢写入,按需建索引。