当前位置: 首页 > news >正文

为什么 MySQL 索引用的是 B+ 树而不是红黑树?

MySQL(特别是 InnoDB 存储引擎)选择B+ 树而不是红黑树(或普通的 B 树)作为索引结构,主要是为了优化磁盘 I/O 性能适应数据库的存储场景

数据库索引的核心挑战在于:数据量巨大,无法全部放入内存,必须存储在磁盘上。而磁盘 I/O 的速度远慢于内存访问速度(相差几个数量级)。因此,索引结构的设计目标就是尽量减少磁盘 I/O 次数

以下是 B+ 树优于红黑树的核心原因:

1. 树的高度更低(减少磁盘 I/O 次数)

这是最根本的原因。

  • 红黑树:是一种二叉树。每个节点只存储一个键值(Key)和一个数据指针。

    • 假设每个节点占用 8KB(一个磁盘页),存储一个 8 字节的 Key 和 8 字节的指针,那么一个节点只能存约 500 个键值(实际上因为指针和元数据,可能更少,但为了对比,我们假设是二叉结构)。
    • 如果要存储 1000 万条数据,红黑树的高度大约是log⁡2(10,000,000)≈24\log_2(10,000,000) \approx 24log2(10,000,000)24层。
    • 这意味着查询一条数据,最坏情况下需要24 次磁盘 I/O
  • B+ 树:是一种多路平衡查找树。每个节点可以存储成百上千个键值。

    • InnoDB 的默认页大小是 16KB。一个非叶子节点可以存储大量的索引键和子节点指针。
    • 假设一个节点能存 1000 个键值(实际更多,因为非叶子节点只存 Key 和指针,不存数据)。
    • 存储 1000 万条数据,B+ 树的高度大约是log⁡1000(10,000,000)≈3\log_{1000}(10,000,000) \approx 3log1000(10,000,000)3层(根节点 + 2 层中间节点 + 叶子节点)。
    • 这意味着查询一条数据,通常只需要3 次磁盘 I/O

结论:B+ 树通过“宽而矮”的结构,极大地降低了树的高度,从而将磁盘 I/O 次数从几十次降低到 3-4 次,性能提升巨大。

2. 更适合范围查询

  • 红黑树:范围查询(如WHERE id > 100 AND id < 200)需要中序遍历整棵树。虽然时间复杂度是O(N)O(N)O(N),但节点在磁盘上是随机分布的,遍历过程中需要频繁地进行磁盘 I/O 跳跃,效率极低。
  • B+ 树
    • 所有数据都存储在叶子节点
    • 叶子节点之间通过双向链表连接
    • 进行范围查询时,只需要找到起始节点,然后沿着链表顺序读取即可。这变成了顺序 I/O,效率极高。

3. 查询性能更稳定

  • 红黑树:虽然也是平衡树,但数据可能分布在树的任何层级。查询不同数据所需的 I/O 次数可能不同(虽然差异不大,但存在)。
  • B+ 树
    • 所有查询都必须走到叶子节点才能获取数据。
    • 这意味着任何查询的 I/O 次数都是固定的(等于树的高度),性能非常稳定,没有“快慢”之分。

4. 节点利用率与缓存友好性

  • 红黑树:每个节点只存一个 Key,导致节点空间利用率低,且每个节点都需要加载到内存页中,缓存命中率低。
  • B+ 树
    • 非叶子节点:只存 Key 和指针,不存数据。这使得非叶子节点可以容纳更多的 Key,进一步降低树高。
    • 叶子节点:存 Key 和完整数据(聚簇索引)或主键(非聚簇索引)。
    • 由于 B+ 树节点大小通常设计为与磁盘页(Page)大小一致(如 16KB),一次 I/O 就能加载一个完整的节点,充分利用了磁盘预读(Read-ahead)机制和 CPU 缓存行(Cache Line)。

5. 插入与删除的稳定性

  • 红黑树:插入或删除节点后,可能需要大量的旋转操作来维持平衡,虽然时间复杂度是O(log⁡N)O(\log N)O(logN),但在磁盘环境下,频繁的节点分裂和合并会导致大量的随机 I/O。
  • B+ 树
    • 插入和删除主要发生在叶子节点。
    • 当节点满时,进行分裂(Split);当节点空时,进行合并(Merge)。
    • 由于 B+ 树节点能容纳大量数据,分裂和合并的频率相对较低,且操作更局部化,对磁盘 I/O 的冲击较小。

总结对比表

特性红黑树 (Red-Black Tree)B+ 树 (B+ Tree)对数据库的影响
树结构二叉树多路平衡查找树B+ 树更矮,I/O 次数少
树高度高 (随数据量线性增长对数)低 (通常 3-4 层)B+ 树查询更快
数据存储任意节点仅在叶子节点B+ 树范围查询极快
范围查询需中序遍历,随机 I/O链表顺序遍历,顺序 I/OB+ 树适合BETWEEN,>
查询稳定性波动 (取决于节点位置)稳定 (固定高度)B+ 树性能可预测
磁盘 I/O频繁,随机极少,顺序/预读友好B+ 树更适合磁盘存储
缓存友好性好 (节点大小=页大小)B+ 树内存利用率高

为什么不是 B 树?

既然 B+ 树这么好,那为什么不用B 树(B-Tree)呢?
B 树和 B+ 树很像,但 B 树的非叶子节点也存储数据

  • 缺点:非叶子节点存储数据后,能容纳的 Key 数量就变少了,导致树的高度比 B+ 树略高,I/O 次数略多。
  • 范围查询:B 树的范围查询需要中序遍历,不如 B+ 树的链表遍历高效。
  • 稳定性:B 树的数据可能分布在任意节点,查询性能不如 B+ 树稳定。

因此,B+ 树是专门为磁盘存储数据库索引场景优化的数据结构,完美平衡了查询、插入、删除和范围扫描的性能。

http://www.jsqmd.com/news/517562/

相关文章:

  • Obsidian笔记中的外部图片如何实现永久存储与本地化管理?
  • Graph U-Nets实战:用PyTorch Geometric实现gPool和gUnpool的5个关键步骤
  • RS485接口EMC设计:三级防护与分地系统实战指南
  • 如何在E-HPC集群上快速部署LAMMPS与oneAPI环境(2023最新版)
  • 数字游民装备:OpenClaw+Qwen3-32B打造移动办公神器
  • 量子纠缠的厨房实验:用硬币和骰子理解贝尔态(图解版)
  • REPL + JSON 双模式:给 Agent 用和给人用的区别
  • STM32F103 CAN总线Bootloader开发实战:从设计到实现
  • Jupyter Notebook配置文件jupyter_notebook_config.py终极指南:从查找到高级定制
  • mPLUG本地VQA效果展示:同一张图不同英文提问(What/How many/Where)对比结果
  • 别再只测正常值了!用这5个真实业务场景,手把手教你玩转边界值测试
  • 安庆好用的隐形车衣价格如何,选安庆一品车行划算吗? - 工业品网
  • 别再傻傻用默认密钥了!MCT读写M1卡保姆级避坑指南(附密钥文件制作)
  • Nano-Banana部署教程:Kubernetes集群中Nano-Banana Studio编排方案
  • Smarty SSTI漏洞防御指南:从攻防世界9分题看PHP模板引擎安全配置
  • 聊聊安庆汽车贴膜公司选购,安庆一品车行性价比如何 - 工业品牌热点
  • 宝塔面板安全设置全攻略:从基础防护到高级WAF配置(含实战避坑指南)
  • 解决 chinesecalendar 跨年项目中的报错问题
  • jQuery Mobile 导航栏深度解析
  • 2026年UVLED固化设备稳定性好的厂家盘点,看看哪家更靠谱 - 工业设备
  • CYBER-VISION零号协议网络协议分析与故障模拟
  • MPC-HC与PotPlayer对比评测:资源占用与播放性能全面分析
  • 永辉购物卡还能这样回收?简单又快速! - 团团收购物卡回收
  • 探寻2026年硅胶防火套老牌厂家,哪家更靠谱 - 工业推荐榜
  • Linux实用功能代码集(2) —— 获得机器文件大小和MD5值
  • MCP/A2A/Agent Skills引爆智能体互联网时代!
  • 高效UI自动化测试的基石:FlaUInspect的核心功能解析与实践指南
  • 最讽刺的是附语
  • 医学论文降AI率哪个好?临床/护理/药学论文专用方案 - 我要发一区
  • 气象数据可视化大屏:如何用动态交互提升天气信息呈现效果