博客
关于我
MySQL中B+Tree索引原理
阅读量:790 次
发布时间:2023-02-11

本文共 1291 字,大约阅读时间需要 4 分钟。

B+树索引简明解析

B+树索引是数据库中最常见且应用最广泛的索引结构之一。它是从平衡二叉树(AVL Tree)和平衡多路查找树(B-Tree)演化而来的,具有更高的效率和更强的适用性。

二叉查找树的基础

二叉树是数据存储的基础结构,二叉查找树(Binary Search Tree,BST)要求左子树所有键值小于根节点键值,右子树所有键值大于根节点键值。其查找效率较低,因为当树深度较大时,查找次数会显著增加。

例如,以下二叉树的查找效率较低:

3   / \  1   4 / \ / \2 3 5 6

深度为3的节点查找次数为3,平均查找次数约为2.3次。

为了提高查找效率,需要引入平衡二叉树。

平衡二叉树(AVL Tree)

平衡二叉树(AVL Tree)是二叉查找树的升级版,确保任意节点的左、右子树高度差不超过1。其失去平衡时会出现四种姿态:LL、RR、LR、RL,需要通过旋转恢复平衡。

AVL树的优点:

  • 保持高度平衡,减少查找深度
  • 查找效率接近理想情况(O(log n))

失去平衡后的旋转方法:

  • LL旋转:使根节点左子树高度超过右子树两级,通过一次旋转恢复平衡。
  • RR旋转:类似LL旋转,但针对右子树。
  • LR旋转:需两次旋转,先围绕左子树进行RR旋转,再围绕根节点进行LL旋转。
  • RL旋转:需两次旋转,先围绕右子树进行LL旋转,再围绕根节点进行RR旋转。

旋转示意图:

3   / \  1   4 / \ / \2 3 5 6

旋转后树的高度降低,查找效率提升。

平衡多路查找树(B-Tree)

B-Tree是为磁盘存储设计的平衡树,优化了B+树的结构。其特点:

  • 每个节点存储多个键值和指针
  • 替换了传统二叉树的左右结构,适合磁盘I/O操作
  • 减少磁盘读取次数,提高查询效率

B-Tree的节点结构:

  • 每个非叶子节点包含n个键值和n+1个指针
  • 键值按升序排列,指针指向子树根节点
  • 每个节点占用一个磁盘块,提升I/O效率

查找关键字29的过程:

  • 根节点磁盘块1读入内存
  • 比较29在区间(17,35),找到指针P2
  • 根据P2读取磁盘块3
  • 比较29在区间(26,30),找到指针P2
  • 根据P2读取磁盘块8
  • 在磁盘块8中找到29
  • 总磁盘I/O操作次数:3次

    B-Tree的优点:

    • 减少磁盘读取次数
    • 提高查询效率
    • 适合外存储索引结构

    B+树:B-Tree的优化版本

    B+树在B-Tree基础上进一步优化:

    • 非叶子节点仅存储键值
    • 叶子节点之间通过链指针连接
    • 数据记录仅存放在叶子节点
    • 树的高度显著降低

    优化后,每个节点存储更多键值,减少磁盘深度,提升查询效率。

    B+树的特点:

    • 数据记录存放在叶子节点
    • 非叶子节点仅存储键值和指针
    • 叶子节点间通过链指针连接
    • 适合大数据量和高并发查询

    常见应用:

    • 聚集索引:叶子节点存储完整记录
    • 辅助索引:叶子节点存储主键

    InnoDB存储引擎中,B+树的高度通常在2至4层,根节点常驻内存,查询效率高。

    总结

    从二叉树到B+树,索引结构不断演化以适应存储需求。B+树通过优化节点结构和查询路径,显著提升了数据库查询效率,成为数据库索引的核心技术。

    转载地址:http://xsbfk.baihongyu.com/

    你可能感兴趣的文章