MySQL 中的 B+树和 B树的区别详解

在数据库索引的底层实现中,B 树(Balanced Tree)B+ 树(Balanced Plus Tree) 是两种常见的数据结构。MySQL 的 InnoDB 存储引擎默认采用 B+ 树索引,而不是普通的 B 树。那么,它们之间究竟有什么区别?为什么 MySQL 更倾向于使用 B+ 树?本文将带你深入理解。


一、为什么数据库需要 B/B+ 树?

在数据库中,索引是提高查询性能的核心手段。

而索引结构必须满足两个条件:

  1. 能够保持有序 ------ 以支持范围查询(如 BETWEEN><)。

  2. 能够高效查找 ------ 降低磁盘 I/O 次数。

二叉查找树虽然也能支持有序和查找,但在海量数据场景下,树的高度可能很深,导致磁盘 I/O 频繁。而 B 树和 B+ 树通过 多路平衡查找 的方式,显著降低了树的高度,提升了性能,因此成为数据库索引的首选。


二、B 树(B-Tree)简介

B 树是一种 多路平衡查找树,常用于文件系统和数据库索引。其主要特征:

  1. 一个节点可以有多个孩子(m 阶 B 树最多 m 个孩子)。

  2. 节点中存储 key 和 data,每个 key 对应一条数据。

  3. 所有叶子节点的深度相同,树始终保持平衡。

B 树的结构示例(3 阶 B 树)

复制代码
          [30]
        /     \
   [10,20]   [40,50,60]
  • 每个非叶子节点存储 索引 + 数据

  • 查找时可能在非叶子节点就能找到数据。


三、B+ 树(B+Tree)简介

B+ 树是 B 树的一种变体,也是 MySQL InnoDB 索引的底层结构

主要特征:

  1. 非叶子节点只存储索引,不存储数据,数据全部存在叶子节点。

  2. 叶子节点通过链表相连,便于范围查询和顺序遍历。

  3. 树的高度更低 ------ 因为非叶子节点只存索引,所以能容纳更多 key。

B+ 树的结构示例(3 阶 B+ 树)

复制代码
          [30]
        /     \
     [10,20]  [40,50,60]
       |          |
 [10,data]...[20,data]...[60,data]
   (叶子节点双向链表连接)
  • 非叶子节点只负责索引,数据都放在叶子节点。

  • 范围查询效率非常高。


四、B 树 vs B+ 树的区别

对比项 B 树 B+ 树
数据存储位置 索引和数据都存储在所有节点中 数据只存储在叶子节点,非叶子节点只存索引
查询效率 查找数据可能在中间节点结束,稳定性较差 必须到叶子节点才能找到数据,查询路径更稳定
磁盘 I/O 每个节点能存的数据较少,树的高度相对高 非叶子节点更小,扇出更大,树高度更低,I/O 次数更少
范围查询 范围查询需要中序遍历整棵树 叶子节点链表天然支持范围查询,效率更高
排序能力 不保证叶子节点顺序存储 叶子节点通过链表顺序连接,天然有序
应用场景 文件系统、部分索引场景 数据库索引的首选(如 MySQL InnoDB)

五、为什么 MySQL 选择 B+ 树而不是 B 树?

  1. 减少磁盘 I/O

    • 数据库索引存在磁盘中,查询时会触发磁盘 I/O。

    • B+ 树非叶子节点不存储数据,能容纳更多索引,使树的高度更低,磁盘访问次数更少。

  2. 范围查询更高效

    • B 树需要通过中序遍历实现范围查询,效率低。

    • B+ 树叶子节点链表相连,范围查询只需遍历链表,效率极高。

  3. 更适合数据库的分页和排序

    • 数据库常见需求是 ORDER BYLIMIT,而 B+ 树的叶子节点有序链表天生支持这些操作。
  4. 查询稳定性

    • B 树可能在非叶子节点就找到数据,导致每次查询路径不同。

    • B+ 树所有查询都走到叶子节点,路径长度一致,查询性能更稳定。


六、总结

  • B 树:索引和数据混合存储,查询可能在中间节点结束,适合较小数据量或文件系统场景。

  • B+ 树:非叶子节点只存索引,数据集中在叶子节点,叶子节点链表顺序连接,更适合数据库索引。

因此,MySQL InnoDB 存储引擎选择 B+ 树作为索引结构 ,主要是为了 减少磁盘 I/O、提高范围查询效率和查询稳定性

相关推荐
广州灵眸科技有限公司11 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒13 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手14 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学14 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
延凡科技14 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
oradh16 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562416 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898617 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD17 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo17 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程