博客
关于我
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/

    你可能感兴趣的文章
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>