在这里插入图片描述

前言

在 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等主流存储引擎默认使用

在这里插入图片描述

更多推荐