博客
关于我
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中having的用法
    查看>>
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>