news 2026/4/18 13:25:11

mysql的B+Tree介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 等关系型数据库高性能查询的基石。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:27:31

基于MATLAB依据菲涅尔公式的光学系数计算

基于MATLAB的根据菲涅尔公式计算: 1.P波、S波的振幅透射系数及振幅反射系数 2.P波、S波的透射比及反射比 3.自然光的透射比和反射比在光学领域,菲涅尔公式对于理解光在不同介质界面处的行为至关重要。今天咱们就借助MATLAB来计算基于菲涅尔公式下各类光学…

作者头像 李华
网站建设 2026/4/18 12:38:08

鸣潮自动化工具终极指南:从新手到专家的完整效率提升方案

鸣潮自动化工具终极指南:从新手到专家的完整效率提升方案 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是…

作者头像 李华
网站建设 2026/4/18 3:52:10

OpenCore Legacy Patcher终极指南:让老旧Mac焕发新生的完整教程

OpenCore Legacy Patcher终极指南:让老旧Mac焕发新生的完整教程 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款革命性的开源工…

作者头像 李华
网站建设 2026/4/18 3:49:35

Kodi字幕库插件完全使用手册:智能字幕下载解决方案

Kodi字幕库插件完全使用手册:智能字幕下载解决方案 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还在为寻找匹配的字幕而烦恼吗?Kodi字幕…

作者头像 李华
网站建设 2026/4/18 3:50:36

鸿蒙系统专属阅读神器:开源阅读App完全使用手册

鸿蒙系统专属阅读神器:开源阅读App完全使用手册 【免费下载链接】legado-Harmony 开源阅读鸿蒙版仓库 项目地址: https://gitcode.com/gh_mirrors/le/legado-Harmony 在鸿蒙生态系统中寻找一款纯净无广告的阅读应用?开源阅读鸿蒙版正是你需要的完…

作者头像 李华
网站建设 2026/4/18 3:49:52

鸣潮智能游戏自动化助手:重新定义你的游戏生活

鸣潮智能游戏自动化助手:重新定义你的游戏生活 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 当游戏从休闲娱…

作者头像 李华