mysql的B+Tree介绍

好的,我们来详细介绍一下 MySQL 中使用的 B+Tree 索引结构。

B+Tree 概述

B+Tree 是一种多路平衡搜索树,它是 B-Tree 的一个变种,常用于数据库和文件系统的索引实现。MySQL 的 InnoDB 存储引擎就使用 B+Tree 作为其索引结构(特别是聚集索引)。

B+Tree 的主要特点

  1. 多叉树结构:每个节点可以有多个子节点(通常远大于 2),这显著降低了树的高度,减少了磁盘 I/O 次数。
  2. 平衡树:所有叶子节点都位于同一层,这保证了查询效率的稳定性,最坏情况下的查询时间复杂度为 O(\\log n)
  3. 节点类型
    • 内部节点(非叶子节点) :只存储键值(索引列的值)和指向子节点的指针。不存储数据本身
    • 叶子节点 :存储键值以及与之关联的实际数据(在 InnoDB 中,对于聚集索引,叶子节点直接包含数据行;对于非聚集索引,叶子节点包含主键值)。所有叶子节点通过指针相互链接,形成一个有序的双向链表。
  4. 数据存储在叶子节点 :这是 B+Tree 区别于 B-Tree 的一个关键点。B-Tree 的数据可以存储在任何节点(内部节点或叶子节点),而 B+Tree 的数据只存储在叶子节点。内部节点仅用于索引导航。
  5. 叶子节点链表 :所有叶子节点按顺序(键值大小顺序)链接在一起。这使得范围查询(例如 WHERE id BETWEEN 10 AND 20)非常高效,只需定位到起始叶子节点,然后沿着链表顺序扫描即可。
  6. 节点填充因子:节点通常不会完全填满,会保留一定的空间(例如 50%)用于插入新数据,减少节点分裂的频率。

B+Tree 的优势(在数据库索引中)

  1. 减少磁盘 I/O:由于是多叉树且树高很低,查找一个键值通常只需访问少量节点(即几次磁盘 I/O)。
  2. 高效的范围查询:叶子节点间的链表使得顺序扫描和范围查询性能优异。
  3. 更高的扇出:由于内部节点不存储数据,仅存储键值和指针,所以一个内部节点可以容纳更多的键值,从而拥有更多的子节点(更高的扇出),进一步降低了树高。
  4. 数据有序性:键值在树中是按顺序存储的(内部节点和叶子节点都是),这支持高效的等值查询和范围查询。
  5. 查询稳定性:所有查询都需要到达叶子节点才能获取数据(或主键),因此查询路径长度是稳定的(等于树高)。

MySQL InnoDB 中的 B+Tree 索引

  • 聚集索引:InnoDB 的表数据本身就是按照主键(或第一个唯一非空索引)组织的一个 B+Tree。叶子节点包含完整的行数据。一张表只能有一个聚集索引。
  • 非聚集索引(辅助索引):叶子节点不包含完整行数据,而是包含索引列的值和对应的主键值。查询时,如果需要非索引列的数据,需要通过主键值回表查询聚集索引。

B+Tree 节点结构示例(概念性 Python 表示)

复制代码
class BPlusTreeNode:
    def __init__(self, is_leaf=False):
        self.keys = []  # 存储键值 (索引列的值)
        self.children = []  # 对于内部节点: 存储指向子节点的指针; 对于叶子节点: 存储数据(聚集索引)或主键值(辅助索引)
        self.is_leaf = is_leaf
        self.next = None  # 仅叶子节点使用: 指向下一个叶子节点的指针 (双向链表)
        self.prev = None  # 仅叶子节点使用: 指向前一个叶子节点的指针 (双向链表)

总结

B+Tree 凭借其平衡性、多叉性、数据仅存于叶子节点以及叶子节点链表等特性,成为数据库索引的理想选择。它高效地支持了数据库最常用的等值查询和范围查询操作,同时最大限度地减少了昂贵的磁盘 I/O 次数,是 MySQL 等关系型数据库高性能查询的基石。

相关推荐
星光一影2 小时前
社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
mysql·微信小程序·小程序·php·uniapp·交友
西安光锐软件2 小时前
asp.net core 项目开发部署上线流程
数据库
云和数据.ChenGuang2 小时前
elk日志运维工程师技术之故障处理
运维·数据库·elk·jenkins·运维工程师
陌路202 小时前
redis五种数据类型
数据库·redis·缓存
不如打代码KK2 小时前
MySQL死锁排查指南
数据库·mysql
打不了嗝 ᥬ᭄3 小时前
【MySQL】数据类型以及库和表的操作
数据库·mysql
ohoy11 小时前
mysql 30天自动补0
数据库·mysql
大学生资源网12 小时前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计
摇滚侠13 小时前
Redis 零基础到进阶,Redis 哨兵监控,笔记63-73
数据库·redis·笔记