# B树和B+树

# B树

# 简介

B树是一种自平衡的树,能够保持数据有序,并且支持在O(log n)时间内进行查找、顺序访问、插入和删除。B树的设计初衷是为了优化磁盘存取性能,它通过增加节点的分支数来减少树的高度,从而减少磁盘I/O次数。

# 特点

  1. 所有叶子节点都在同一层
  2. 每个节点可以存储多个键值对(阶数决定具体数量)
  3. 所有节点(除根节点)至少半满
  4. 节点的子节点数量总是比键值对数量多1
  5. 适合磁盘存储系统,每个节点大小通常等于磁盘块大小

# 基本操作

  1. 查找

    • 从根节点开始,根据键值的大小关系选择合适的子树
    • 在节点内部使用二分查找定位键值
    • 平均时间复杂度O(log n)
  2. 插入

    • 先找到合适的叶子节点
    • 如果节点未满,直接插入
    • 如果节点已满,进行分裂操作
  3. 节点分裂示例

# 应用场景

  1. 文件系统

    • 用于管理文件的索引结构
    • 支持快速的文件查找和目录遍历
  2. 数据库索引

    • 支持高效的范围查询
    • 适应大规模数据的存储和检索

# B+树

# 简介

B+树是B树的变体,专门针对数据库系统的文件组织和索引而设计。它在B树的基础上做了重要的改进,使其更适合数据库和文件系统的应用场景。

# 特点

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

    • 非叶子节点只存储键值,不存储数据
    • 数据存储在叶子节点可以提高空间利用率
  2. 叶子节点通过指针连接

    • 形成有序链表
    • 支持高效的顺序访问
  3. 非叶子节点结构

    • 只存储键值和指针
    • 可以容纳更多索引项
    • 降低树的高度
  4. 查询优化

    • 所有查询都要到达叶子节点
    • 查询路径统一,效率稳定
    • 范围查询性能优异

# 优势

  1. 范围扫描效率高

    • 叶子节点链表支持顺序访问
    • 适合范围查询和排序操作
  2. 磁盘读写效率高

    • 节点大小匹配磁盘块
    • 减少I/O次数
  3. 树高度更低

    • 非叶子节点可存储更多索引
    • 减少查询时的磁盘访问次数

# 应用场景

  1. 关系型数据库索引

    • MySQL(InnoDB存储引擎)
    • PostgreSQL
    • Oracle
  2. 文件系统

    • NTFS
    • ext4
    • XFS
  3. 特点比较

    • B树:适合随机访问,键值对分布在所有节点
    • B+树:适合范围查询,数据集中在叶子节点