【mysql存储引擎为什么选择B+树】

🌳 数据库树结构与 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 非常慢!

二叉树问题:

  1. 节点太少(一个节点只有一个 key)→ 树太高

  2. 访问一次节点就可能一次磁盘 IO

  3. 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+ 树的改进:

  1. 所有数据存储在叶子节点

  2. 非叶子只存 key,不存数据 → 节点更小、更"扁平"

  3. 叶子节点通过链表连接 → 支持范围查询(如 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,叶子链表顺序访问 ✅ 最优
相关推荐
小龙报2 小时前
【算法通关指南:算法基础篇(四)】二维差分专题:1.【模板】差分 2.地毯
c语言·数据结构·c++·深度学习·神经网络·算法·自然语言处理
立志成为大牛的小牛2 小时前
数据结构——五十八、希尔排序(Shell Sort)(王道408)
数据结构·学习·程序人生·考研·算法·排序算法
Han.miracle2 小时前
优选算法-004 盛最多水的容器
数据结构·算法
小白程序员成长日记3 小时前
2025.12.09 力扣每日一题
数据结构·算法·leetcode
天赐学c语言3 小时前
12.10 - 合并两个有序链表 && 对字节对齐的理解
数据结构·c++·leetcode·链表
仰泳的熊猫3 小时前
1092 To Buy or Not to Buy
数据结构·c++·算法·pat考试
罗湖老棍子3 小时前
【深基16.例3】二叉树深度(洛谷P4913)
数据结构·算法·二叉树