Mysql为什么使用B+树而不是B树

136 阅读2分钟

MySQL选择使用B+树作为索引结构,而非B树,主要原因包括以下几点:

  1. 磁盘读取效率优化

    • B+树的每个节点不存储数据(对于非叶子节点),只存储键值。这使得每个节点可以容纳更多的键,因此树的高度相比于B树更低。在数据库系统中,数据通常存储在磁盘上,而磁盘IO是相对昂贵的操作。B+树由于其较低的高度,意味着在进行查找时需要访问更少的磁盘块,从而减少了磁盘I/O次数。
  2. 顺序访问性

    • B+树的所有叶子节点形成一个有序链表,所有真实的数据都存储在叶子节点,并且按照键值排序。这种特性使得范围查询极其高效,只需从某个叶子节点开始,沿着链表顺序遍历即可,不需要像B树那样进行跳跃式访问。
  3. 空间利用率

    • B+树内部节点不保存实际的数据记录,这样能够将更多空间用于存储索引键,从而提高空间利用率和索引结构的紧凑性。
  4. 缓存友好

    • 由于数据只存在叶子节点,并且叶子节点间是连续的,这有利于数据库系统利用操作系统的缓冲区来预读相邻的数据块,进一步提升性能。
  5. 全字段检索

    • 在OLAP分析场景下,B+树支持覆盖索引(即查询结果可以直接由索引提供,无需回表获取其他列),如果所有需要查询的数据都在索引页中,那么可以大大减少对主存的访问。

综上所述,B+树相比B树更适合大规模数据、频繁的范围查询以及磁盘存储的数据库环境,它在设计上充分考虑了磁盘I/O和查询效率之间的平衡,从而成为关系型数据库管理系统如MySQL首选的索引结构。