MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

news2025/6/12 1:27:44

文章目录

 一、背景知识:什么是 B-Tree 和 B+Tree?

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

  B+Tree(B-Tree 的变种)

 二、结构对比:一张图看懂

 三、为什么 MySQL InnoDB 选择 B+Tree?

1. 范围查询更快

 2. 数据访问更稳定

3. 节点利用率更高,降低树高

 四、示例演示:索引结构差异

B-Tree 查找

B+Tree 查找(MySQL InnoDB 使用)

 五、实际应用中的建议

 六、总结

 附:面试回答模板

 推荐阅读


 一、背景知识:什么是 B-Tree 和 B+Tree?

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

  • 是一种多路平衡搜索树,每个节点可以有多个子节点。

  • 每个节点同时存储键和值,并维护有序结构。

  • 查找时可能在非叶子节点就找到目标数据。

  B+Tree(B-Tree 的变种)

  • 所有实际数据只存在叶子节点

  • 非叶子节点只存键(索引),作为导航用途。

  • 所有叶子节点之间通过链表连接,支持高效的范围查找。


 二、结构对比:一张图看懂

特性B-TreeB+Tree
数据存储位置所有节点都存键和值只有叶子节点存值,非叶子只存键
范围查询效率较低,需遍历多个节点高,叶子节点链表支持顺序遍历
查询命中位置可能在中间节点一定命中在叶子节点,访问路径更稳定
节点利用率较低,数据占空间更高,非叶节点只存键,占空间更少
是否支持顺序遍历支持但不高效天然支持(链表结构)
MySQL 支持情况(MyISAM 用过早期版本)InnoDB 默认使用 B+Tree

 三、为什么 MySQL InnoDB 选择 B+Tree?

1. 范围查询更快

SQL 中很多查询是范围查找:

SELECT * FROM orders WHERE price BETWEEN 100 AND 500;

B+Tree 中,叶子节点按大小排序,并通过链表连接,只需顺着链表扫描,性能极高。


 2. 数据访问更稳定

在 B+Tree 中,无论查找哪个值,路径总是走到叶子节点,避免 B-Tree 中“命中中间节点”的不确定性,有利于磁盘缓存和预读。


3. 节点利用率更高,降低树高

  • 非叶子节点只存键值,占空间更小;

  • 每层可存更多索引,树高更低,减少磁盘 IO 次数

举例:如果单次 IO 能读 16KB,一个节点能放 400 个索引项,3 层 B+Tree 可管理 6400 万条记录,极大提高性能。


 四、示例演示:索引结构差异

B-Tree 查找

        [10 | 20]
       /    |    \
   [5]   [15]   [25]

可能在中间节点 [10 | 20] 就找到了值,不必下探。


B+Tree 查找(MySQL InnoDB 使用)

        [10 | 20]
       /    |    \
 [5]→[10]→[15]→[20]→[25]

所有数据都在叶子节点,查找、范围扫描、排序更高效。


 五、实际应用中的建议

场景建议
主键索引B+Tree 最适合
范围查询 / 排序字段用 B+Tree(天然支持)
哈希查找不建议使用 B-Tree / B+Tree,适用 Hash 索引(Memory 引擎)
高频随机查询可配合缓存使用,优化 IO

 六、总结

B+Tree 是为数据库量身定制的索引结构,MySQL InnoDB 使用它正是因为它在磁盘存储、范围查询、空间效率上都表现优异。

对比点B-TreeB+Tree (MySQL 使用)
查询速度中等更稳定
范围查询效率一般极高
IO 次数可能少更可控
空间利用率较低更高

 附:面试回答模板

Q:MySQL 为什么使用 B+Tree 而不是 B-Tree?

答:

因为 B+Tree 将所有数据放在叶子节点,并通过链表连接,查询路径稳定、范围查询效率高、节点利用率高,能有效减少磁盘 IO,特别适合大规模数据场景。InnoDB 就是基于 B+Tree 的索引结构。


 推荐阅读

  • 《高性能 MySQL》第三章 索引基础

  • MySQL 官方文档:InnoDB 索引结构

  • MIT 6.830 数据库系统课程:Tree-based Indexing

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP 8.5 即将发布:管道操作符、强力调试

前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…