mysql中b树索引与b+树索引的那些事儿
·

前言
在 MySQL 中,B 树索引 和 B+ 树索引 是数据库存储引擎中用于提高查询效率的两种常见结构,但在实际应用中,MySQL 主要使用的是
B+ 树索引(尤其是 InnoDB 引擎)。我们来详细对比一下 B 树(B-Tree) 和 B+ 树(B+Tree) 的结构和区别。
🔍 一、结构区别(先上干货,后面再具体对比)
| 项目 | B 树(B-Tree) | B+ 树(B+Tree) |
|---|---|---|
| 数据存储 | 数据和索引都存储在所有节点(包括非叶子节点) | 所有数据都存储在叶子节点,非叶子节点只存储索引(键) |
| 叶子节点 | 叶子节点之间无连接 | 叶子节点通过链表相连,形成一个有序链 |
| 查询方式 | 查询可能在非叶子节点中就结束 | 查询必须到达叶子节点 |
| 范围查询 | 需要中序遍历所有节点 | 只需顺序遍历叶子节点链表,效率高 |
| 磁盘IO性能 | 查询时可能访问多个层次节点 | 索引更稳定、分支更高、IO更少 |
🧠 二、逻辑行为上的区别
1. 查询效率
B+ 树更适合范围查询和排序,因为叶子节点是按序连接的链表结构,只需顺序遍历即可。
B 树查询效率略低,尤其是范围查找,不能直接按链表方式遍历。
2. 数据结构层级
B 树: 数据在内层节点也存在,树的高度较小,但每次查找可能结束于不同的节点。
B+ 树: 所有数据都在叶子节点,内层节点结构更稳定,树的高度可能略高,但查找路径统一。
🧱 三、MySQL 中的实际应用
| 引擎类型 | 使用的索引结构 |
|---|---|
| InnoDB(默认引擎) | 使用 B+ 树索引 |
| MyISAM | 使用 B+ 树索引 |
| Memory | 默认也是 B+ 树索引(除非使用 HASH 索引) |
✅ 为什么使用 B+ 树:
1、支持范围查询和排序:InnoDB 中 ORDER BY、BETWEEN 等操作效率很高。
2、非叶子节点更小:因为只存储键值,单页可存储更多索引项,减少磁盘IO。
3、全表扫描效率更高:叶子节点通过链表连接,可以快速顺序读取全部数据。
🧪 四、举个例子说明差异
假设你有如下数据项:10,20,30,40,50
✅ B 树:
[30]
/ \
[10,20] [40,50]
数据既存在于根节点 [30],也存在于叶子节点 [10,20] 和 [40,50]
查找 30,可以直接在根节点找到
范围查找 20 ~ 50,要遍历多个节点
✅ B+ 树:
[30]
/ \
[20] [40]
| |
[10,20]→[30,40,50]
所有数据 [10,20,30,40,50] 都存储在叶子节点,叶子节点通过链表相连
查找 30,要先查索引,再到叶子节点定位
范围查找 20 ~ 50,只需顺序遍历叶子节点链表
🧾 总结
| 比较项 | B 树 | B+ 树 |
|---|---|---|
| 数据存储位置 | 所有节点 | 仅叶子节点 |
| 查询路径 | 不一定到叶子节点 | 一定到叶子节点 |
| 范围查询 | 效率较低 | 效率高(链表结构) |
| 索引层稳定性 | 不稳定,插入删除会影响结构 | 更稳定,非叶子节点不存数据 |
| MySQL 使用情况 | 基本不用 | ✅InnoDB等主流存储引擎默认使用 |

更多推荐

所有评论(0)