MySQL索引为什么要用B+树实现?

首先,得先了解什么是B树什么是B+树

什么是B树

自平衡二叉树虽然能保持查询操作的时间复杂度在O(logn),但是因为它本质上是一个二叉树,每个节点只能有 2 个子节点,那么当节点个数越多的时候,树的高度也会相应变高,这样就会增加磁盘的 I/O 次数,从而影响数据查询的效率。

为了解决降低树的高度的问题,后面就出来了 B 树,它不再限制一个节点就只能有 2 个子节点,而是允许 M 个子节点 (M>2),从而降低树的高度。

B 树的每一个节点最多可以包括 M 个子节点,M 称为 B 树的阶,所以 B 树就是一个多叉树。

假设 M = 3,那么就是一棵 3 阶的 B 树,特点就是每个节点最多有 2 个(M-1个)数据和最多有 3 个(M个)子节点,超过这些要求的话,就会分裂节点,比如下面的的动图:
请添加图片描述
我们来看看一棵 3 阶的 B 树的查询过程是怎样的?
请添加图片描述

假设我们在上图一棵 3 阶的 B 树中要查找的索引值是 9 的记录那么步骤可以分为以下几步:

  1. 与根节点的索引(4,8)进行比较,9 大于 8,那么往右边的子节点走;
  2. 然后该子节点的索引为(10,12),因为 9 小于 10,所以会往该节点的左边子节点走;
  3. 走到索引为9的节点,然后我们找到了索引值 9 的节点。

可以看到,一棵 3 阶的 B 树在查询叶子节点中的数据时,由于树的高度是 3 ,所以在查询过程中会发生 3 次磁盘 I/O 操作。

而如果同样的节点数量在平衡二叉树的场景下,树的高度就会很高,意味着磁盘 I/O 操作会更多。所以,B 树在数据查询中比平衡二叉树效率要高。

但是 B 树的每个节点都包含数据(索引+记录),而用户的记录数据的大小很有可能远远超过了索引数据,这就需要花费更多的磁盘 I/O 操作次数来读到「有用的索引数据」。

而且,在我们查询位于底层的某个节点(比如 A 记录)过程中,「非 A 记录节点」里的记录数据会从磁盘加载到内存,但是这些记录数据是没用的,我们只是想读取这些节点的索引数据来做比较查询,而「非 A 记录节点」里的记录数据对我们是没用的,这样不仅增多磁盘 I/O 操作次数,也占用内存资源。

另外,如果使用 B 树来做范围查询的话,需要使用中序遍历,这会涉及多个节点的磁盘 I/O 问题,从而导致整体速度下降。

什么是 B+ 树?

B+ 树就是对 B 树做了一个升级,MySQL 中索引的数据结构就是采用了 B+ 树,B+ 树结构如下图:
在这里插入图片描述
B+ 树与 B 树差异的点,主要是以下这几点:

叶子节点(最底部的节点)才会存放实际数据(索引+记录),非叶子节点只会存放索引;

所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表;

非叶子节点的索引也会同时存在在子节点中,并且是在子节点中所有索引的最大(或最小)。

非叶子节点中有多少个子节点,就有多少个索引;

下面通过三个方面,比较下 B+ 和 B 树的性能区别。

1、单点查询

B 树进行单个索引查询时,最快可以在 O(1) 的时间代价内就查到,而从平均时间代价来看,会比 B+ 树稍快一些。

但是 B 树的查询波动会比较大,因为每个节点即存索引又存记录,所以有时候访问到了非叶子节点就可以找到索引,而有时需要访问到叶子节点才能找到索引。

B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。

2、插入和删除效率

B+ 树有大量的冗余节点,这样使得删除一个节点的时候,可以直接从叶子节点中删除,甚至可以不动非叶子节点,这样删除非常快,

注意:B+ 树对于非叶子节点的子节点和索引的个数,定义方式可能会有不同,有的是说非叶子节点的子节点的个数为 M 阶,而索引的个数为
M-1(这个是维基百科里的定义),因此我本文关于 B+ 树的动图都是基于这个。但是我在前面介绍 B+ 树与 B+
树的差异时,说的是「非叶子节点中有多少个子节点,就有多少个索引」,主要是 MySQL 用到的 B+ 树就是这个特性。

甚至,B+ 树在删除根节点的时候,由于存在冗余的节点,所以不会发生复杂的树的变形。
B 树则不同,B 树没有冗余节点,删除节点的时候非常复杂,比如删除根节点中的数据,可能涉及复杂的树的变形。

B+ 树的插入也是一样,有冗余节点,插入可能存在节点的分裂(如果节点饱和),但是最多只涉及树的一条路径。而且 B+ 树会自动平衡,不需要像更多复杂的算法,类似红黑树的旋转操作等。

因此,B+ 树的插入和删除效率更高。

3、范围查询

B 树和 B+ 树等值查询原理基本一致,先从根节点查找,然后对比目标数据的范围,最后递归的进入子节点查找。

因为 B+ 树所有叶子节点间还有一个链表进行连接,这种设计对范围查找非常有帮助,比如说我们想知道 12 月 1 日和 12 月 12 日之间的订单,这个时候可以先查找到 12 月 1 日所在的叶子节点,然后利用链表向右遍历,直到找到 12 月12 日的节点,这样就不需要从根节点查询了,进一步节省查询需要的时间。

而 B 树没有将所有叶子节点用链表串联起来的结构,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。

因此,存在大量范围检索的场景,适合使用 B+树,比如数据库。而对于大量的单个索引查询的场景,可以考虑 B 树,比如 nosql 的MongoDB。

MySQL 的存储方式根据存储引擎的不同而不同,我们最常用的就是 Innodb 存储引擎,它就是采用了 B+ 树作为了索引的数据结构。

MySQL 中的 B+ 树
在这里插入图片描述

但是 Innodb 使用的 B+ 树有一些特别的点,比如:

B+ 树的叶子节点之间是用「双向链表」进行连接,这样的好处是既能向右遍历,也能向左遍历。

B+ 树点节点内容是数据页,数据页里存放了用户的记录以及各种信息,每个数据页默认大小是 16 KB。

Innodb 根据索引类型不同,分为聚集和二级索引。他们区别在于,聚集索引的叶子节点存放的是实际数据,所有完整的用户记录都存放在聚集索引的叶子节点,而二级索引的叶子节点存放的是主键值,而不是实际数据。

因为表的数据都是存放在聚集索引的叶子节点里,所以 InnoDB 存储引擎一定会为表创建一个聚集索引,且由于数据在物理上只会保存一份,所以聚簇索引只能有一个,而二级索引可以创建多个。

了解完B树和B+树再去思考MySQL索引为什么要用B+树实现更加透彻

为什么需要索引?

在数据库中,索引是一种特殊的数据结构,用于加速数据的检索。通过索引,数据库可以快速地定位记录,从而提高查询效率。如果没有索引,数据库中的每条记录都需要逐条扫描,查询效率将大大降低。

总结:为什么选择B+树作为索引结构?

在选择索引结构时,需要考虑以下因素:

  • 支持哪些查询操作
  • 数据量大小
  • 数据的插入、更新、删除操作频率

B+树正好满足这些要求,具有以下特点:

  • B+树的叶子节点包含了所有的关键字和指向数据的指针,因此B+树支持非常高效的范围查询操作,例如“查找所有年龄在20~30岁之间的人”。
  • B+树非常适合存储大量数据,每个节点可以存储多个关键字和指针,可以大大减少磁盘I/O的次数。
  • B+树的插入和删除操作相对于其他数据结构来说,效率非常高。每次插入和删除只需要操作B+树的叶子节点,因此不需要涉及到非叶子节点的复杂调整操作。

因此,MySQL选择使用B+树作为索引结构来达到高效的检索,尤其是对于大数据量的查询和更新操作时。

看到这,相信大家不仅对索引有了理解,也对B+树的实现更加清晰
下面是根据chatgpt生成的图the thinking monkey
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Altman:巨型AI模型时代结束;马斯克TruthGPT曝光|每日创新观察

今日看点: OpenAI CEO:巨型AI模型时代已结束Stable Diffusion-XL开启公测马斯克TruthGPT曝光Adobe Premiere Pro 将引入新 AI 工具OpenAI CEO:巨型AI模型时代已结束 参考链接 OpenAI的首席执行官山姆奥特曼(Sam Altman&#xff…

RWKV:在Transformer时代重新定义循环神经网络

论文地址:https://arxiv.org/abs/2305.13048 参考:https://www.zhihu.com/question/602564718/answer/3041307432 RWKV: Reinventing RNNs for the Transformer Era RWKV:在Transformer时代重新定义循环神经网络 Abstract 摘要 Transformer已…

2023 4月份 华为硬件开发岗位实习生机考回忆

2023 4月份 华为硬件开发岗位实习生机考回忆 Proscribe !本帖只用作学习之意,若违反任何要求或侵权将立马删除,其中答案也可能错误,实际的工程应用和理论也有所区别,仅收录部分题目和答案等,仅供参考。&a…

那些Edge浏览器的神仙插件

浏览器插件选的好,网上冲浪没烦恼 文章目录 浏览器下载插件解除网页下载限制清理浏览器缓存标签自动刷新视频速度控制广告拦截器图片助手护眼模式超级复制翻译插件音乐插件喵喵折智能AI浮图秀油猴 早在五月份的时候就发过一张关于插件的动态,今天再来仔细…

复试常见问题

复试常见问题 语言相关操作系统组成原理计算机网络数据结构算法设计与分析深度学习梯度消失与梯度爆炸过拟合与欠拟合---退化神经网络中有哪些正则化技术?激活函数的作用?学习率太大(太小)时会发生什么?如何设置学习率?‍什么是数…

GPT之战,谷歌真的要输了?越来越多顶尖研究员跳槽OpenAI

来源:新智元 近期一场大讨论:为什么越来越多Google顶尖研究员跳槽OpenAI?这场LLM战役它还能打赢吗? 知友回复 莱斯大学博士、知友「一堆废纸」表示,其实谷歌和OpenAI的差距,是数据的差距。 「OpenAI对LLM有…

html+css实现星系图

往期内容: 01-htmlcssjs实现时钟 02-htmlcssjs实现骰子 03-htmlcssjs实现点名系统 文章目录 01-htmlcssjs实现时钟02-htmlcssjs实现骰子03-htmlcssjs实现点名系统前言一、整体效果二、代码实现1.背景图2.主体星系3.添加文字效果4.整体代码 总结 前言 本文通过ht…

涌html编写星空图,canvas实现十二星座星空图

效果如下: 代码如下:canvas星座 * { margin: 0; padding: 0; } #box{ margin:10px 0 0 10px;; } input{ outline: none; font-size:16px; } p{ margin-bottom: 10px } input[typedate]{ height:36px; text-indent:10px; } input[typebutton]{ background…

联邦计算在百度观星盘的实践

导读:本文简短综述联邦计算领域的核心技术点,随着联邦计算在产业界的应用及普及,保护数据隐私与解决数据孤岛,二者可以兼得,为数字广告营销等领域提供了一个全新思路。 全文4761字,预计阅读时间12分钟。 …

c语言 校正时区算法,如何正确校正星盘中的时差与时区

如何正确校正星盘中的时差与时区以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 制作命盘中最容易产生误差的就是时区问题了。 因为中国幅员辽阔,横跨好几个时区,但都…

C#: 星座星盘计算算法

前一篇提到计算八卦五行的算法,这里要跟大家分享一个星座星盘的算法。你们可能觉得笔者怎么开始研究这些玄幻的东西了,确实笔者觉得有一些真的是很扯,不过笔者的目的是为了研究大数据。好了,说到星盘笔者发现新浪星座有个很不错的…

星盘php,占星树星盘教程:如果通过星盘推算盘主适合哪个领域的工作?

塔罗 星盘占卜,请找阳阳老师 ~ XYZ:无论你遇到任何疑问,都请随时留言给阳阳老师,我会在看到信息后的第一时间回复的 Orz... 关注我,每天一个关于命理学的一个小知识(笑) ————其它热点内容请在文章底部查看 今天&a…

【Prompting】ChatGPT Prompt Engineering开发指南(6)

ChatGPT Prompt Engineering开发指南:Expanding/The Chat Format Expanding自定义对客户电子邮件的自动回复提醒模型使用客户电子邮件中的详细信息 The Chat Format总结内容来源 在本教程中,第一部分学习生成客户服务电子邮件,这些电子邮件是…

做外贸如何能提高开发信的回复率?

Snow给我分享了一封他们的开发信,我觉着写得很好,分享给大家。 各位可以仔细看下这封开发信。 一封好的开发信,要包含下面一些个要点: 1. 尽可能的简单,不要太长,一般3-8句话就可以了,太长客户…

ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题

来源: 专知 任务语义可以用一组输入到输出的例子或一条文本指令来表示。传统的自然语言处理(NLP)机器学习方法主要依赖于大规模特定任务样本集的可用性。出现了两个问题: 首先,收集特定于任务的标记示例,不适用于任务可能太复杂或太昂贵而无法注释&#…

使用Python机器学习预测足球比赛结果:第一篇 数据采集 (下)

利物浦7比0狂胜曼联,这个锅不能再让C罗背了吧。预测足球比分有什么好方法吗? 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 探索足球结果和赔率的 Python 项目。 那么,让我们按照我所遵循的步骤进行&a…

cas latex模板参考文献APA等引用格式(Elsevier期刊)

目录 一、在模板中引入需要的 .bst 文件,每个文件都是一种参考文献的格式 二、模板中引入.bst 文件的格式 三、在 \documentclass 之后,\begin{document} 之前,引入 natbib 包 四、在文章正文中引用参考文献 例如:期待的参考文献格…

作为测试人员,我们该如何看待AI

前几天看到一篇文章讨论从测试人员的角度去理解AI的,稍微翻译了一下。原文地址https://stevethedoc.wordpress.com/2023/06/18/how-should-we-view-ai-as-testers 上周三和周四,我有幸与我的两位同事Sushmitha Sivan和Bhavana Akula一起参加了伦敦的AI峰…

【Ai工具合集,一定有你需要的!】

花费了一天的时间测试了市面上各大Ai工具,然后帮大家整理总结出来了这些工具,一定记得点赞收藏保存,后面肯定会用到! 使用说明 1.部分Ai工具需要魔法上网,请自行解决;部分工具需要收费,可以尝…

把 ChatGPT 加入 Flutter 开发,会有怎样的体验?

前言 ChatGPT 最近一直都处于技术圈的讨论焦点。它除了可作为普通用户的日常 AI 助手,还可以帮助开发者加速开发进度。声网社区的一位开发者"小猿"就基于 ChatGPT 做了一场实验。仅 40 分钟就实现了一个互动直播 Demo。他是怎么做的呢?他将整个…