为什么Mysql要用B+树来实现呢,而不是B树?

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

1. 更低的树高与更高的查询效率

  • B+ 树的内部节点不存储实际数据,只存放键值和子节点指针,因此每个节点能容纳更多键,从而有效降低树的高度。
  • 树高越低,查询时需要的磁盘 I/O 次数越少,尤其适合磁盘存储系统,其中 I/O 是主要性能瓶颈。

2. 更高效的范围查询

  • B+ 树的所有叶子节点通过指针连接成有序链表,范围查询时只需找到起始点,然后沿链表顺序遍历即可,无需回溯父节点。
  • B 树进行范围查询可能需要多次中序遍历,效率较低。

3. 更稳定的查询性能

  • B+ 树中任何查询都必须到达叶子节点才能获取数据,因此每次查询的路径长度相对稳定。
  • B 树的数据可能分布在内部节点或叶子节点,查询性能不稳定(有时很快,有时较慢)。

4. 更适合磁盘预读特性

  • B+ 树的节点大小通常设置为磁盘页大小(如 16KB),每次 I/O 可读取一个完整节点。内部节点仅存储键,能容纳更多子指针,进一步减少树高和磁盘访问次数。

5. 更高的数据扫库效率

  • 全表扫描时,B+ 树只需遍历叶子节点链表,顺序 I/O 效率高。
  • B 树需要进行树的中序遍历,可能涉及多次随机 I/O,效率较低。

6. 插入和删除操作更优

  • B+ 树的数据都存储在叶子节点,插入和删除时调整通常局限于叶子节点,且链表结构便于局部调整,树结构变化相对平缓。
  • B 树可能需要在内部节点进行复杂的旋转和合并,维护成本更高。

在 MySQL 的 InnoDB 存储引擎中,聚簇索引(主键索引)的叶子节点直接存储行数据,辅助索引的叶子节点则存储主键值,再通过主键索引查找数据(回表)。这种设计结合 B+ 树的特性,在点查询、范围查询和顺序访问等场景下都能提供高性能。


作 者:南烛
链 接:https://www.itnotes.top/archives/975
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇