MySQL中B树索引和B+树索引有什么区别?
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《MySQL中B树索引和B+树索引有什么区别?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
如果用树作为索引的数据结构,每查找一次数据就会从磁盘中读取树的一个节点,也就是一页,而二叉树的每个节点只存储一条数据,并不能填满一页的存储空间,那多余的存储空间岂不是要浪费了?为了解决二叉平衡搜索树的这个弊端,我们应该寻找一种单个节点可以存储更多数据的数据结构,也就是多路搜索树。
1. 多路搜索树
1、完全二叉树高度:O(log2N),其中2为对数,树每层的节点数;
2、完全M路搜索树的高度:O(logmN),其中M为对数,树每层的节点数;
3、M路搜索树主要用于解决数据量大无法全部加载到内存的数据存储。通过增加每层节点的个数和在每个节点存放更多的数据来在一层中存放更多的数据,从而降低树的高度,在数据查找时减少磁盘访问次数。
4、所以每层的节点数和每个节点包含的关键字越多,则树的高度越矮。但是在每个节点确定数据就越慢,但是B树关注的是磁盘性能瓶颈,所以在单个节点搜索数据的开销可以忽略。
2. B树-多路平衡搜索树
B树是一种M路搜索树,B树主要用于解决M路搜索树的不平衡导致树的高度变高,跟二叉树退化为链表导致性能问题一样。B树通过对每层的节点进行控制、调整,如节点分离,节点合并,一层满时向上分裂父节点来增加新的层等操作来来保证该M路搜索树的平衡。
M为B树的阶数或者说是路数,在B树中,每个节点都是一个磁盘块(页)。每个非叶子节点存放了关键字和指向儿子树的指针,具体数量为:M阶的B树,每个非叶子节点存放了M-1个关键字和M个指向子树的指针。如图为5阶B树结构的示意图:

3. B树索引
首先创建一张user表:
create table user( id int, name varchar, primary key(id) ) ROW_FORMAT=COMPACT;
假如我们使用B树对表中的用户记录建立索引:

B树的每个节点占用一个磁盘块,磁盘块也就是页,从上图可以看出,B树相对于平衡二叉树,每个节点存储了更多的主键key和数据data,并且每个节点拥有了更多的子节点,子节点的个数一般称为阶,上述图中的B树为3阶B树,高度也会降低。假如我们要查找id=28的用户信息,那么查找流程如下:
1、根据根节点找到页1,读入内存。【磁盘I/O操作第1次】
2、比较键值28在区间(17,35),找到页1的指针p2;
3、根据p2指针找到页3,读入内存。【磁盘I/O操作第2次】
4、比较键值28在区间(26,35),找到页3的指针p2。
5、根据p2指针找到页8,读入内存。【磁盘I/O操作第3次】
6、在页8中的键值列表中找到键值28,键值对应的用户信息为(28,po);
B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。
4. B+树索引
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,B+树的性质:
1、非叶子节点的子树指针与关键字个数相同;
2、为所有叶子节点增加一个链指针;
3、所有关键字都在叶子节点出现, 且链表中的关键字恰好是有序的;
4、非叶子节点相当于是叶子节点的索引,叶子节点相当于是存储(关键字)数据的数据层;
InnoDB存储引擎就是用B+Tree实现其索引结构。
从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
B+Tree相对于B-Tree有几点不同:
1、非叶子节点只存储键值信息和指向子节点页号的指针;
2、所有叶子节点之间都有一个链指针;
3、数据记录都存放在叶子节点中;

根据上图我们来看下 B+ 树和 B 树有什么不同:
(1) B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。
页的大小是固定的,InnoDB 中页的默认大小是 16KB。如果不存储数据,那么就会存储更多的键值,相应的树的阶数就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数又会再次减少,数据查询的效率也会更快。
另外,如果我们的 B+ 树一个节点可以存储 1000 个键值,那么 3 层 B+ 树可以存储 1000×1000×1000=10 亿个数据。一般根节点是常驻内存的(第一次检索根节点不用读取磁盘),所以一般我们查找 10 亿数据,只需要 2 次磁盘 IO。
(2) B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。
B+ 树中各个页之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的,通过这种方式可以找到表中的所有数据。B+ 树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。而 B 树因为数据分散在各个节点,要实现这一点是很不容易的。
今天关于《MySQL中B树索引和B+树索引有什么区别?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
如何在 Windows 11/10中查看哪个应用程序正在访问您的网络摄像头?
- 上一篇
- 如何在 Windows 11/10中查看哪个应用程序正在访问您的网络摄像头?
- 下一篇
- 创建一个全面而高效的MIT泊松流生成模型:质量与速度俱佳,超越扩散模型。
-
- 难过的牛排
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者分享文章!
- 2023-06-11 10:05:04
-
- 拼搏的煎饼
- 这篇技术贴真及时,作者大大加油!
- 2023-06-10 05:50:25
-
- 欣喜的天空
- 这篇文章真是及时雨啊,细节满满,受益颇多,已加入收藏夹了,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-05-27 14:09:20
-
- 辛勤的菠萝
- 太细致了,已加入收藏夹了,感谢up主的这篇技术贴,我会继续支持!
- 2023-05-18 06:35:42
-
- 数据库 · MySQL | 2小时前 |
- MySQL JSON 数组检索要不要建多值索引:从 MEMBER OF 到不能排序的边界
- 463浏览 收藏
-
- 数据库 · MySQL | 14小时前 | MySQL · 连接管理 · 服务器配置 · max_connections MySQL 9.4 back_log 连接突发
- MySQL 9.4 为什么把 back_log 默认值提到 10000:连接突发时先看这条边界
- 488浏览 收藏
-
- 数据库 · MySQL | 22小时前 | MySQL · InnoDB · server_memory · 内存配置 ·
- MySQL 9.4 的 server_memory 怎么用:限制默认内存估算,不是给 InnoDB 加缓存
- 215浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL 8.4 隐藏索引怎么试:不删索引也能验证查询计划
- 133浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 501浏览 收藏
-
- 数据库 · MySQL | 5天前 | MySQL · 数据库设计 · 索引优化 · mysql UUID_TO_BIN BIN_TO_UUID swap_flag 二进制UUID
- MySQL UUID_TO_BIN 如何保持时间有序:swap_flag 与 BIN_TO_UUID 还原边界
- 261浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL 隐形列怎么兼容 SELECT *:INVISIBLE COLUMN 的灰度加字段方法
- 122浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 132次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 50次使用
-
- ClickPrompt
- ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
- 19次使用
-
- Google AI提示词库
- 探索Google Cloud官方生成式AI提示词库,提供免费、无需登录的中英双语Prompt模板。涵盖内容创作、代码优化、数据分析等场景,助您快速提升AI交互效率与质量。
- 27次使用
-
- Gradio
- Gradio是一个用于构建机器学习和数据科学Web应用的开源Python库。支持快速创建交互界面,获Google、Meta等大厂青睐,适合模型演示、部署反馈及调试。
- 131次使用
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览
-
- MySQL排序性能优化技巧及方法
- 2025-06-04 501浏览

