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

MySQL 选择 B+ 树作为索引结构而不是红黑树,主要基于以下几个关键原因:

1. 磁盘 I/O 效率

B+ 树是为磁盘存储系统优化的数据结构:

  • 多路平衡查找树:B+ 树的每个节点可以包含多个键值(通常为几百个),大大降低了树的高度
  • 减少磁盘访问次数:3-4 层的 B+ 树就能存储千万级的数据,而红黑树作为二叉树,存储相同数据量时高度会大得多
  • 顺序访问优势:B+ 树的叶子节点形成链表,适合范围查询和全表扫描

2. 更适合数据库场景的特性

  • 更高的扇出(fan-out):B+ 树非叶子节点只存储键值不存储数据,使得每个节点能容纳更多指针
  • 稳定的查询性能:B+ 树所有查询都要走到叶子节点,性能稳定(O(log n)),而红黑树不同路径长度可能不同
  • 更适合预读:磁盘按页读取,B+ 树的节点大小通常设计为页大小的整数倍,充分利用预读特性

3. 与红黑树的对比

特性B+ 树红黑树
树高度更矮(多路平衡)更高(二叉树)
磁盘 I/O更优(适合块存储)较差
范围查询高效(叶子节点链表)需要中序遍历
节点利用率更高(填充因子通常为1/2到满)每个节点只有2个子节点
实现复杂度较高相对简单

4. MySQL 的具体实现

  • InnoDB 存储引擎中,B+ 树的叶子节点存储的是完整的数据记录(聚簇索引)
  • MyISAM 存储引擎中,B+ 树的叶子节点存储的是数据记录的指针
  • B+ 树支持高效的插入、删除和更新操作,同时保持树的平衡

总结来说,B+ 树在数据库索引场景下提供了更好的磁盘 I/O 性能、更高的查询效率和更适合范围查询的特性,这些优势使得它成为关系型数据库索引的首选数据结构。

THE END
喜欢就支持一下吧
点赞9 分享