🌳 数据库树结构与 MySQL B+ 树索引完整教程(含图解 + BF解释)
一、什么是树结构?🌲
树(Tree)是一种常用的数据结构,用于快速查找、排序和组织数据。
从简单到复杂,树结构大致发展如下:
BST → AVL → 红黑树 → B 树 → B+ 树
其中,数据库最常用的是 B+ 树(MySQL InnoDB 使用)。
我们将逐个讲解,并附上清晰的图解。
🌱 二、二叉搜索树(BST)
1. BST 定义
-
左子树 < 根节点 < 右子树
-
查找平均 O(log n),最坏 O(n)
2. BST 图解
✅ 正常情况(树相对平衡)
8
/ \
3 10
/ \ \
1 6 14
❌ 退化成链表(插入 1,2,3,4,5)
1
\
2
\
3
\
4
\
5
➡ 缺点:容易退化 → 查找效率下降
因此需要"平衡树"。
⚖️ 三、AVL 树(严格平衡二叉树)
AVL 树是第一种"高度平衡"的二叉树。
⭐ BF(Balance Factor)平衡因子解释
BF = 左子树高度 − 右子树高度
AVL 的约束:
BF ∈ { -1, 0, 1 }
超过范围就要旋转(LL、RR、LR、RL)。
AVL 图示(带 BF)
① 正常平衡情况
30(BF=0)
/ \
20(BF=0) 40(BF=0)
② 不平衡(经典 LR 情况)
插入:30 → 10 → 20 后得到:
30(BF=2) ← 左高-右高=2 → ❌ 不合法
/
10(BF=-1) ← 左高0 - 右高1 = -1
\
20(BF=0)
③ 通过旋转变为平衡
旋转后会变成:
20(BF=0)
/ \
10(BF=0) 30(BF=0)
特点:
✔ 查找超级快(严格 log n)
❌ 插入、删除频繁旋转 → 成本高
➡ 适用于内存索引,不适合磁盘。
🔴⚫ 四、红黑树(Red-Black Tree)
比 AVL "松一些",追求插入/删除效率更高。
红黑树规则(简写版)
-
根是黑色
-
红节点不能有红孩子
-
每条路径的黑节点数相等
红黑树图解
10(黑)
/ \
5(红) 15(红)
特点:
✔ 必然保持"弱平衡"
✔ 插入/删除效率比 AVL 好
❌ 仍是二叉树 → 太"瘦"、太"高" → 不适合数据库磁盘结构
🌳 五、为什么数据库不用二叉树?(关键)
数据库瓶颈来自:
⚡ 磁盘 IO 非常慢!
二叉树问题:
-
节点太少(一个节点只有一个 key)→ 树太高
-
访问一次节点就可能一次磁盘 IO
-
IO 越多,查询越慢
因此数据库需要"一个节点里放很多 key"的大节点树结构。
于是出现:
👉 B 树 & B+ 树
🌴 六、B 树(B-Tree)
B 树是多路平衡树,一个节点存多个 key。
大大降低树的高度,非常适合磁盘。
B 树 ASCII 图(以 3 阶为例)
[ 10 | 20 ]
/ | \
[5 | 7] [12 | 15] [22 | 30]
特点:
-
每个节点存多个 key
-
所有节点(包括叶子)都存数据
-
树高度很低
🌴✨ 七、B+ 树(B+Tree)------数据库索引标准
InnoDB 的核心数据结构。
📌 B+ 树的改进:
-
所有数据存储在叶子节点
-
非叶子只存 key,不存数据 → 节点更小、更"扁平"
-
叶子节点通过链表连接 → 支持范围查询(如 BETWEEN)
B+ 树 ASCII 图
[ 10 | 20 | 30 ]
/ | \
/ | \
[1|5|7] [11|12|18] [21|25|28]
↓ ↓ ↓
(链 表 连 接 的 叶 子 节 点)
叶子节点链表示意:
[1|5|7] → [11|12|18] → [21|25|28]
🌟 八、为什么 MySQL 使用 B+ 树?(核心问答)
| 结构 | 是否适合磁盘 | 是否支持范围查询 | IO 次数 | 是否用于 MySQL |
|---|---|---|---|---|
| BST | ❌ | ❌ | 高 | 否 |
| AVL | ❌ | ❌ | 高 | 否 |
| 红黑树 | ❌ | ❌ | 高 | 否 |
| B 树 | ✔ | 一般 | 较低 | 部分 |
| B+ 树 | ✔ 最适合 | ✔ 完美支持 | 最低 | InnoDB 引擎使用 |
B+ 树适合 MySQL 的原因:
⭐1. 节点更"扁平",IO 最少
非叶子节点不存数据 → 一个节点能放更多 key → 树更矮。
⭐2. 范围查询超级快
叶子节点链表结构:
k1 → k2 → k3 → ... → kn
BETWEEN、>、< 都是顺序扫描叶子链表。
⭐3. 适合大规模数据
高度通常是 2--4 层,即使上亿数据也只需几次 IO。
💽 九、MySQL 常用存储引擎与索引
1. InnoDB(默认)
-
使用 B+ 树索引
-
聚簇索引(主键索引)
-
支持事务、外键、行锁
2. MyISAM
-
使用 B+ 树索引
-
非聚簇索引
-
不支持事务与行锁(已很少使用)
📘 十、总结
| 树类型 | 数据结构特点 | 磁盘 I/O | 范围查询 | 顺序扫描 | 节点存储效率 | 适合 MySQL 吗? |
|---|---|---|---|---|---|---|
| 二叉搜索树 (BST) | 左<根<右 | 高 | 差,需要中序遍历 | 差 | 节点少,树高 → I/O 多 | ❌ |
| AVL 树 / 红黑树 | 平衡二叉树 | 中 | 中 | 中 | 树高度高,节点少 → 每页存储少 | ❌ |
| B 树 | 多路平衡树,数据存内部+叶子 | 较少 | 中等 | 中等 | 每页存储更多 key | ✔ 可用,但范围查询慢 |
| B+ 树 | 多路平衡树,数据只在叶子 | 最少 | 高效 | 高效 | 每页存储更多 key,叶子链表顺序访问 | ✅ 最优 |
