为什么MySQL用b+不用B数

MySQL(特别是其默认存储引擎 InnoDB)使用 B+ 树 而不是 B 树 作为索引结构,主要是因为 B+ 树在数据库系统中具有以下几个关键优势,更适合磁盘 I/O 和范围查询等常见数据库操作:


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

  • B+ 树 :内部节点只存储索引键(用于导航),实际的数据(或指向数据的指针)全部存储在叶子节点
  • B 树:每个节点(包括内部节点)都可能存储数据。

优势

  • 叶子节点可以形成一个有序链表 ,便于高效执行范围查询 (如 WHERE id BETWEEN 10 AND 100)。
  • 内部节点不存数据,可以容纳更多键,从而降低树的高度,减少磁盘 I/O 次数。

2. 更高的扇出(Fan-out) → 更矮的树

  • 因为 B+ 树的内部节点只存键(不存数据),每个页(如 InnoDB 的 16KB 页)能存放更多键。
  • 假设一个页能存 1000 个键,那么:
    • 2 层 B+ 树可索引约 100 万条记录(1000 × 1000)
    • 3 层可索引约 10 亿条记录

优势:树更"矮胖",查找任意记录最多只需 2~3 次磁盘 I/O,性能稳定。


3. 范围查询效率高

  • B+ 树的叶子节点通过指针顺序连接,遍历范围数据时只需顺序读取叶子节点。
  • B 树的范围查询需要中序遍历整棵树,效率低且难以优化。

优势 :对 ORDER BYGROUP BY、范围扫描等操作非常友好。


4. 更适合磁盘存储模型

  • 数据库以页(Page) 为单位读写磁盘(InnoDB 默认 16KB)。
  • B+ 树的设计天然契合"一次读取一页"的 I/O 模型。
  • 所有数据集中在叶子层,缓存和预读策略更容易优化。

对比总结:

表格

特性 B 树 B+ 树
数据存储位置 所有节点 仅叶子节点
内部节点是否存数据 否(只存索引键)
叶子是否链式连接
范围查询效率 较低
树高度 相对较高 更矮(因扇出更大)
适合场景 内存查找、单点查询为主 磁盘存储、范围查询、数据库索引

补充说明

  • MySQL 的 MyISAM 引擎也使用 B+ 树。
  • 其他数据库(如 PostgreSQL、Oracle、SQL Server)同样普遍采用 B+ 树作为主索引结构。
  • 哈希索引适用于等值查询(如 Memory 引擎),但不支持范围查询,因此不适合作为主索引。

结论

MySQL 使用 B+ 树而非 B 树,是因为 B+ 树在磁盘 I/O 效率、范围查询性能、树高控制等方面更契合关系型数据库的实际需求。

相关推荐
mysqloffice7 分钟前
数智时代,核心系统数据库架构往哪走
数据库·人工智能
l1t14 分钟前
DeepSeek总结的 pgColumnar 1.0-alpha4 发布说明
数据库·postgresql
DBA_G24 分钟前
南大通用GBase 8s数据库助力某农商行核心系统投产
数据库
工业涂料百问1 小时前
【环保合规】系列(四)工业涂料碳足迹怎么算?边界定义、因子选择与减排优先级拆解
数据库
wuyk5552 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
文人sec2 小时前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
高级程序源2 小时前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计
后端·python·mysql·小程序·django·flask·课程设计
Omics Pro2 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
旺仔不是程序员3 小时前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写
数据库·后端·sql
YangYang9YangYan3 小时前
2026 电商数据运营校招 JD 梳理|岗位任务、技能与面试考点汇总
大数据·数据库·数据分析