十张图“拿捏”MySQL中B+树的生成过程

news2024/11/13 10:08:00

hello,我是大都督周瑜,这篇文章带你用十张图“拿捏”MySQL中B+树的生成过程。

更多干货技术文章、面试题,欢迎关注我的公众号:IT周瑜

当MySQL接收到一条以下SQL时,表示要从t1表中查询数据:

select * from t1 where id = 3;

那表的数据存在哪呢?

自然是磁盘文件,每个表创建的时候都需要专门创建一个文件来存表的一行一行数据,这个文件叫做用户表空间文件,也就是ibd文件。

当执行insert语句时,比如:

insert into t1(id, a, b) values(3, 1, 'zhouyu');

MySQL需要将insert语句解析为一行数据,比如以上insert对应的一行记录为

画板

但是这是逻辑层面的,这一行记录真正要存到磁盘,需要转成二进制。

id和a字段都是int类型,占4个字节,只需要将十进制转成二进制即可,b字段是字符,需要根据设置的字符编码来转成二进制,如果是ascii,那么每个字符对应一个字节。

最终这行记录对应的二进制为

画板

把记录转成二进制之后,就需要存在到文件中了,也就是

画板

如果多存储几行,那就是

画板

这么看其实还是逻辑的,真正在磁盘中行和行之间是没有框框的,而是

画板

因此,当插入了多行数据行后,如果行和行之间没有指定的分割符,那在获取数据的时候就不好区分各行的数据了,因此需要明确定义好行的格式,我们可以在每行记录前定义一个记录头,固定占4个字节,其中一个字节用来存当前记录的长度,也就是字节数,另外三个字节先空着。

画板

如果依次插入的是:

insert into t1(id, a, b) values(3, 1, 'zhouyu');
insert into t1(id, a, b) values(9, 5, 'dadudu');
insert into t1(id, a, b) values(6, 8, 'xiaodudu');

那么对应的就是

画板

不过,不知道大家发现问题没有,现在插入的数据并没有按id升序排序,我们先不管为什么要按id排序,我们先想如何按id进行升序排序,难道移动记录的物理位置吗?

当然不用这么麻烦,我们可以在每行记录再新增一个隐藏字段,叫做next_record,相当于链表节点的指针,这样就可以通过这个next_record来控制记录的逻辑顺序了,而不用移动物理位置。

画板

所谓的记录的指针,就是对应记录在文件中字节的编号,或者叫做偏移量,比如40就是表示文件中第40个字节是当前记录的下一条记录,在InnoDB的设计中是指向了记录的中间,这样既方便获取记录的字段,又方便获取记录的next_record,为了好理解,我们还是把指针箭头画出来

画板

还有一个更严重的问题,假如现在执行where查询,比如:

select * from t1 where b = 'dadudu';

需要遍历每行记录进行判断,那难道每次从文件中获取一行记录进行判断吗?那当然不行,记录多了那得做很多次IO。

因此有了页,每页默认16KB,不过一页能存多少条记录就不是固定的了。

画板

我们假如一页只能存三条,那么现在要存9条记录,就需要3页,也就是3个16KB。

画板

注意,每页中可能有空隙的,所以页和页之间我都留了一点空隙。

innodb每次都会取16kb的数据出来,然后遍历这16kb数据中的每行记录,可是如何知道有没有下一页呢?因此每页除开会存数据行之外,还额外有一个page header的固定空间,用来存page_no和next_page,page_no表示页号,从0开始,next_page表示下一页,存的就是下一页的页号,因为每页固定是16KB,因此只要知道page_no就能从文件中定位到具体页的物理位置,从而读取该页的内容,比如要获取page_no=2的页内容,那就直接从第2*16384个字节开始取,取16384个字节就是page_no=2的页的内容。

画板

那如果数据越来越多呢?有很多页呢?此时执行where查询也需要进行很多次io,性能也不高了。

此时就需要用到索引了,索引的本质就是排序,我们可以额外再开辟16kb,也就是一个新页,page_no=3,该页中记录其他页的页号和最小的id值。

画板

  • (3,0)记录表示指向page_no=0的页,并且该页中最小的id为3
  • (15,1)记录表示指向page_no=1的页,并且该页中最小的id为15
  • (28,2)记录表示指向page_no=2的页,并且该页中最小的id为28

以上其实就是一颗B+树了,只不过如果换成以下这样更容易理解,但真正的实现是上图。

画板

本文旨在描述MySQL中B+树大概的生成过程,忽略了很多细节,比如表空间具体的格式、记录行具体的格式、页的具体格式、B+树的根页转换过程、页的拆分过程、页的重组过程等等,大家如果对这些感兴趣,可以关注我的公众号:IT周瑜。

本文主要内容就分享到这里,希望能得到大家的点赞和分享。

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

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

相关文章

基于java+springboot+vue实现的林业产品推荐系统(文末源码+Lw)135

基于SpringBootVue的实现的林业产品推荐系统(源码数据库万字Lun文流程图ER图结构图演示视频软件包) 系统功能: 林业产品推荐系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。 并按照软件设计开发流程进行…

新书宣传:《量子安全:信息保护新纪元》

《量子安全:信息保护新纪元》 前言本书的看点本书的目录结语 前言 你好! 这是我第一次发布类广告的博文,目的也很单纯,希望以作者的身份介绍一下自己出版的图书——《量子安全:信息保护新纪元》。此书于2024年7月出版…

【go】pprof 性能分析

前言 go pprof是 Go 语言提供的性能分析工具。它可以帮助开发者分析 Go 程序的性能问题,包括 CPU 使用情况、内存分配情况、阻塞情况等。 主要功能 CPU 性能分析 go pprof可以对程序的 CPU 使用情况进行分析。它通过在一定时间内对程序的执行进行采样&#xff0…

17个常见的电子邮件营销错误及避免方法

我们都在邮件营销中犯过错误。你点击发送,然后感到一阵沉重的感觉。你搞砸了,现在全世界都能看到你的错误。这就像把一封信放在瓶子里扔进无边的互联网海洋,你无法把它收回来。 有些邮件营销错误显而易见,可能会让你所有的努力化…

Redis学习Day3——项目工程开发`

扩展阅读推荐: 黑马程序员Redis入门到实战教程_哔哩哔哩_bilibili 使用git命令行将本地仓库代码上传到gitee/github远程仓库-CSDN博客 一、项目介绍及其初始化 学习Redis的过程,我们还将遇到各种实际问题,例如缓存击穿、雪崩、热Key等问题&…

想将桌面移动到D盘,但是不小心将D盘整个改成桌面的快捷方式了的解决办法

本帖为经验分享,因而附带了解释。 着急的uu请直接按照红色(蓝色)加粗标号直接操作! 目录 一、问题描述 二、问题出现的原因 三、解决方法 一、问题描述 想将桌面移动到D盘,但是不小心将D盘整个改成桌面的快捷方式。…

老旧电力系统安全隐患增加 该如何预防电气线路老化等因素引发的电气火灾呢?

为应对我国电气火灾事故频发的挑战,安科瑞电气股份有限公司开发了AcrelCloud-6000安全用电管理云平台。这一平台依托移动互联网和云计算技术,结合物联网传感器,将办公楼、学校、医院、工厂、体育场馆、宾馆及福利院等人员密集场所的电气安全数…

爬虫--基于python的旅游网站数据分析与可视化实现---附源码78517

摘要 在数字化时代,旅游网站积累了大量用户数据,这些数据中蕴藏着丰富的信息和价值。为了更好地理解用户行为、优化旅游服务体验和提高业务运营效率,对旅游网站数据进行深度挖掘和可视化展示显得尤为重要。本文借助Python编程语言&#xff0c…

前端Excel热成像数据展示及插值算法

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏:《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️生活的理想,就是为了理想的生活! 目录 📘 前言 📘一、热成像数…

最受欢迎的10款电脑监控软件大揭秘,员工电脑监控软件真心推荐

随着科技的迅猛发展,越来越多的企业和个人开始关注电脑监控软件的使用。这类软件能够帮助企业管理者更好地了解员工的工作状况,提升工作效率,并确保公司数据安全;个人用户也可以利用这些软件监控电脑活动,保护家人尤其…

电源自动测试系统有哪些原理和优势?

‌电源自动测试系统是一种自动测试设备,用于对各类电源模块进行功能和性能测试。它采用模块化设计,构建了一个方便快捷、功能齐全的电源测试平台,便于后续的检修和维护,减少对企业生产和测试的影响。 电源自动测试系统的工作原理和…

区块链学习笔记3--以太坊

智能合约:跑在以太坊系统中的代码合同,其实质是一段代码。目前已经存在180多万个智能合约。 智能合约能表达:规则明确,不受主观因素影响的业务。 智能合约能表达:规则不轻易修改的业务 如果业务的规则经常变化&#x…

2025第九届数字信号处理国际会议(ICDSP 2025)将在成都召开!

第九届数字信号处理国际会议(ICDSP 2025)将于2025年2月21-23日在成都召开。ICDSP 2025大会由西南交通大学和西华大学联合主办, 并得到各地高校和机构的技术支持。大会旨在邀请众多国内外学者及产业研发人员齐聚一堂,共同探讨数字信号处理领域…

ABB机械手备份与恢复

ABB机械手备份与恢复 备份恢复系统 备份 ABB机器人数据备份的对象是所有正在系统内存中运行的RAPID程序和系统参数。当机器人系统出现错乱或者重新安装系统以后,可以通过备份快速地把机器人恢复到备份时的状态。 如果导出到U盘需要将U盘插入USB接口,位置…

docker-01 创建一个自己的镜像并运行容器

docker-01 创建一个自己的镜像并运行容器 前言 我们都知道使用Docker的镜像可以快速创建和部署应用,大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境,确保代码的环境一致性,从而不会在出现这段代码在我机器上没问…

通过mxGraph在ARMxy边缘计算网关上实现工业物联网

在当今的工业4.0时代,工业物联网(IIoT)已经成为制造业转型升级的关键技术之一。ARMxy边缘计算网关作为工业自动化和物联网的重要组成部分,能够为工厂车间提供实时的数据处理能力和智能化服务。而mxGraph作为一种流行的JavaScript库…

ABB的IO板卡配置

ABB的IO板卡配置 标准IO板卡DSQC651IO板卡的配置数字量输入信号配置数字量输出信号配置组合输入信号配置组合输出信号配置模拟量输出信号配置 标准IO板卡DSQC651 DSQC651可以处理8路输入数字量,8路输出数字量和2路模拟量输出信号。 X1是数字量输出,接线…

agentuniverse快速开始和踩坑

https://github.com/alipay/agentUniverse/tree/mastergithub地址:https://github.com/alipay/agentUniverse/tree/master 老大看了演示demo也想跟着做个agent工具,但踩坑太多,含泪写下博客 前置环节 git clone https://github.com/alipay/agentUniverse.git conda create -n…

轻松发高分的好思路:GNN+时间序列预测!新SOTA效率翻了5倍

在时序预测领域,通过合理构建和应用图结构,GNN能有效捕捉时空数据中的复杂依赖关系,轻松提高预测的准确性。因此GNN时序预测在学术界和工业界都广受欢迎。 最近这个方向出现了很多效果很好的研究,比如GraFITi模型,利用…

[AHK]Listbox with incremental search

可以根据文本框中的输入内容,实时动态从列表中搜索并定位所搜索内容。 AHK V1代码 #Requires AutoHotkey v1.0 Gui Add, Edit, w300 h20 vsearchedString gIncrementalSearch Gui Add, ListBox, vchoice gListBoxClick w300 h250 hscroll vscroll Gui Add, Button, …