《MySQL怎样运行的》—InnoDB数据页结构

在上一篇文章中我们讲了,InnoDB的数据页是InnoDB管理存储空间的基本单位,一个页的大小基本为16kb
那你有没有疑问,就是说这个InnoDB的数据页的结构是什么样的,还有他这些结构分别有那些功能~接下来我们一一讲解

数据页的总览结构

他既然是一个数据页,那咱们总体概括它的结构的时候,就用一个书页来形容~
在这里插入图片描述
他自上而下分别是

  1. File Header 文件头部 主要作用是保存页的一些通用信息

  2. Page Header 页头部 主要作用是保存数据页的一些专有信息

  3. Inifmum+Supermum 最小记录+最大记录 两个虚拟的记录

  4. User Records 用户记录 主要作用是用户存储的记录内容

  5. Free Space 空闲空间 一些还没有使用的空间

  6. Page Directory 页目录 主要的作用是页中某些记录的相对位置 asda

  7. File Trailer 文件尾部 主要的作用是检查文件是否完整

接下来我们会就这些结构来展开以一个个的讲解,然后3+4统称为记录
下面的讲解我们可能不会按照顺序来进行,先说一下其中的重点记录(3+4)~

记录在页中的存储

我们刚刚说了3+4统称为记录,我们脑子肯定在想,这些记录在页中的流程是什么?那我们就直接上图
在这里插入图片描述
其实在一开始的时候,是没有User Records这一用户空间的,原因很简单,就是因为在一开始我们是没有在里面有任何记录的呀~
当我们添加数据之后,就会往页里面插数据,如上图,当User Records满的时候,Free Space就起作用了~但是当这个Free Space使用完了的时候,这个页就已经使用完毕了,我们就需要创建新的页来储存数据
但是我们再思考一下User Records他怎么管理这些数据的,与我们上一章的内容有关
还记得COMPACT行列式吗他是结构是什么?
是不是变长字段长度列表,NULL值列表,记录头信息,真实的数据。

在记录头信息中的秘密

我们先来回忆下记录头信息的结构
在这里插入图片描述
一共就5个字节,然后40个二进制位;
他们每个的作用

  • delete_mask: 删除标志位,很重要。若此标志位为1,代表这条记录已经被删除了。
  • min_mask:B+树非叶子节点中,索引记录的中最小记录。后面讲到索引的时候再说。
  • n_owned: 分组里面包含的记录总数,分组后面再说。
  • heap_no: 后面再说。
  • record_type:很重要,记录的类型(0-普通用户记录,1-索引记录,2-Infimum,3-Supremum)
  • next_record: 指针,指向下一条记录,很重要。

这上面不是说heap_no后面再说吗?现在就用到了,记录这个记录在页堆中的相对位置
又有疑问了,什么是堆,设计InnoDB的大叔把下面这种记录紧密排列的结构叫做堆
在这里插入图片描述
然后这个heap_no的值为什么我们没有看见0和1记录呢?
这其实是个设计者的小把戏~还记得我们之前说过的Inifmum+Supermum吗?
最小记录与最大记录,他们其实是这个设计者在每条记录前默认加进去的我们可以叫他为伪记录和虚拟记录~
那么我们既然提到了最小与最大,那我就有疑问记录能比较吗?
其实这里我们比较的是主键值的大小,这个东西下一章会详细解释
现在我们讲一下Inifmum与Supremum的结构
他俩的结构其实很简单,就是前面有5个字节的记录头信息+后面的8个字节大小的固定单词哈哈哈哈
Inifmum就他自己,Supermum也是他自己~
另外一点就是heap_no的记录的值在分配之后就不会发生改动了,删掉也不会动。
然后我们说几个比较重要的记录头信息
record_type:很重要,记录的类型(0-普通用户记录,1-索引记录,2-Infimum,3-Supremum)
next_record: 指针,指向下一条记录,很重要
heap_no:记录这个记录在页堆中的相对位置
在这里插入图片描述
上面的图片就比较形象了,然后就是如果你删除一条记录的时候他会发生以下事情

  1. 他的deleted_flag就会变成1
  2. next_record变成0,也就是意味这没有下一条记录了
  3. 上一条的next_record指向该记录的下一条next_record
    然后就是Suoermum的n_owned值由n变为n-1

Page Directory页目录

这个意思就比如说,我们再看书的时候是不是先看目录,这个也一样,书的目录不是分成一个一个组吗,然后找的想要看的页码,然后去找到目标,设计InnoDB的指挥者也为我们设计了一个类似的东西,制作过程就如下:

  1. 先把所有的记录分为几个组(但是不包括垃圾链表的记录)
  2. 然后每个组里的最后一个记录相当于“带头大哥”,组里其他的记录相当于“小弟”,大哥记录里面的头信息的n_owned值为组里一共有多少个记录
  3. 到现在我们没有提到目录,重头戏来了,将每个组里的最后一条记录的地址偏移量提取出来(啥是地址偏移量:就是这个记录的第0个字节到真实数据之间的距离),按照顺序储存在靠近页尾部的地方,这个地方就是页目录~,页目录里面的这些地址偏移量就叫做槽,每个槽占两个字节,页目录就是由多个槽构成的。
    在这里插入图片描述

Page Header页面头部

这个地方就是储存数据页的一些特定状态
在这里插入图片描述

File Header 文件头部

他这个地方就是存放一些通用的状态
在这里插入图片描述

File Trailer 文件尾部

就是前四个字节为校验和
后四个字节代表页最后修改时的对应LSN的后四个字节
用于校验这个文件是否完整

下一章节我们来开始第6章 B+树索引!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型,有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢?今天我们就来聊聊这个问题。 目前来看,主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

java中的Collections类+可变参数

一、概述 Collections类是集合类的工具类,与数组的工具类Arrays类似 二、可变参数(变:数量) 格式:参数类型名...参数,可变参数就是一个数组 注意:可变参数必须放在参数列表的最后并且一个参数列表只能有一个可变参…

Golang | Leetcode Golang题解之第101题对称二叉树

题目: 题解: func isSymmetric(root *TreeNode) bool {u, v : root, rootq : []*TreeNode{}q append(q, u)q append(q, v)for len(q) > 0 {u, v q[0], q[1]q q[2:]if u nil && v nil {continue}if u nil || v nil {return false}if …

conda 环境找不到 libnsl.so.1

安装prokka后运行报错 perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 通过conda list 可以看到 有libsnl 2.00版本,通过修改软链接方式进行欺骗

Vue3项目练习详细步骤(第一部分:项目构建,登录注册页面)

项目环境准备 工程创建 安装依赖 项目调整 注册功能 页面结构 接口文档 数据绑定和校验 数据接口调用 解决跨域问题 登录功能 接口文档 数据绑定和校验 数据接口调用 优化登录/注册成功提示框 项目演示 项目的后端接口参考:https://blog.csdn.net/daf…

selenium 学习笔记(一)

pip的安装 新建一个txt curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 把上面的代码复制进去后,把后缀名改为.bat然后双击运行 当前目录会出现一个这个文件 然后在命令行pyhon get-pip.py等它下好就可以了selenium安装 需要安装到工程目…

第15章-超声波避障功能 HC-SR04超声波测距模块详解STM32超声波测距

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 15.1-超声波测距 完成超声波测距功能、测量数据显示在OLED屏幕上 硬件介绍 使用&#…

react 保持组件纯粹

部分 JavaScript 函数是 纯粹 的,这类函数通常被称为纯函数。纯函数仅执行计算操作,不做其他操作。你可以通过将组件按纯函数严格编写,以避免一些随着代码库的增长而出现的、令人困扰的 bug 以及不可预测的行为。但为了获得这些好处&#xff…

【问题解决】huggingface 离线模型下载

问题 因业务需要在本机测试embedding分词模型,使用 huggingface上的transformers 加载模型时,因为网络无法访问,不能从 huggingface 平台下载模型并加载出现如下错误。 下面提供几种模型下载办法 解决 有三种方式下载模型,一种是通…

《书生·浦语大模型实战营》第1课 学习笔记:书生·浦语大模型全链路开源体系

文章大纲 1. 简介与背景智能聊天机器人与大语言模型目前的开源智能聊天机器人与云上运行模式 2. InternLM2 大模型 简介3. 视频笔记:书生浦语大模型全链路开源体系内容要点从模型到应用典型流程全链路开源体系 4. 论文笔记:InternLM2 Technical Report简介软硬件基础…

苹果手机数据不慎删除?这4个方法果粉必看!

苹果手机该怎么恢复丢失的数据呢?有时候会因为使用不当或者是被他人误删等原因,导致重要的数据丢失,这时我们需要找回丢失手机数据,小编给大家分享4种恢复苹果手机数据的技巧,大家赶紧来学一学吧! 一、iclo…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近,很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器,还是最新的数码产品,平时挺贵的东西在618期间会便宜不少。不过,这么多东西可选,促销活动也多得让人看花了眼&#xf…

SAM遥感图像处理开源新SOTA!在GPU上实现40倍加速,不损准确性

在遥感图像处理领域,通过SAM捕捉复杂图像特征和细微差异,可以实现高精度的图像分割,提升遥感数据的处理效率。这种高度的准确性让SAM遥感展现出了比传统方法更优越的性能。 不仅如此,这种策略灵活普适的特性还能拓展遥感技术的应…

Python | Leetcode Python题解之第102题二叉树的层序遍历

题目: 题解: class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []res, queue [], collections.deque()queue.append(root)while queue:tmp []for _ in range(len(queue)):node queue.popl…

Unity3D让BoxCollider根据子物体生成自适应大小

系列文章目录 unity工具 文章目录 系列文章目录unity工具 👉前言👉一、编辑器添加👉二、代码动态添加的方法(第一种)👉三、代码动态添加的方法(第二种)👉四、重新设置模型的中心点👉壁纸分享👉…

分布式事务解决方案(最终一致性【可靠消息解决方案】)

可靠消息最终一致性解决方案 可靠消息最终一致性分布式事务解决方案指的是事务的发起方执行完本地事务之后,发出一条消息,事务的参与方,也就是消息的消费者一定能够接收到这条消息并且处理完成,这个方案强调的是只要事务发起方将消…

03 FreeRTOS 同步互斥与通信

1、同步与互斥 一句话理解同步与互斥:我等你用完厕所,我再用厕所。 什么叫同步?就是:哎哎哎,我正在用厕所,你等会。 什么叫互斥?就是:哎哎哎,我正在用厕所,你…

太阳能语音监控杆(球机LED款)有什么用

传统监控设备依赖电力支持,在偏远地区和没有网络地区难以发挥其作用,而鼎跃安全的太阳能语音监控杆(球机LED款)在传统监控基础上,进行了全面优化,解决了无电无网区域使用受限的问题。 太阳能语音监控杆&am…

关于已配好java环境但双击无法打开jar包的解决方案

如果你已经装好了 java 环境直接跳到最后看解决方法即可 先说一下你安装的 java 环境,如果完全是默认选项安装,则会安装 jdk 和 jre,并且在安装 jre 时还需要安装目录下为空,其实 jre 的安装是多余的,因为安装的 jdk 里…

无人机侦察:雷达系统概述

一、雷达基本原理 无人机侦察中的雷达系统主要基于无线电波的传播和反射原理。雷达发射机产生特定频率的电磁波,并通过天线以定向波束形式向空间发射。当这些电磁波遇到目标时,部分能量会被反射回来,被雷达接收机捕获。通过测量发射和接收电…