《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+树索引!!!

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

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

相关文章

Linux笔记之命令行JSON处理器jq

Linux笔记之命令行JSON处理器jq code review! 文章目录 Linux笔记之命令行JSON处理器jq1.安装2.jq 基本用法3.例程3.1. 示例JSON文件3.2. 读取特定字段3.3. 管道过滤器(Pipe Filters)3.4. 映射过滤器(Map Filters)3.5. 条件过滤…

短视频都是怎么剪的:四川京之华锦信息技术公司

短视频都是怎么剪的 随着移动互联网的迅猛发展,短视频已成为人们日常生活中不可或缺的一部分。无论是记录生活的点滴,还是展示个人才艺,短视频都以其短小精悍、直观生动的特点,吸引了众多用户的关注。四川京之华锦信息技术公司那…

自动化重置数据库功能的探索与实践

1、简介 在现代软件开发中,尤其是涉及到数据驱动的应用程序时,开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态,自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务,但我是部署在自己的家庭nas-极空间z4pro里的,属于内网环境。 另外我有一台阿里云服务器,做跳板机。 我有一个阿里的域名…

老Java学 Go 笔录(二) 从 go 的编译开始学起

目录 一.版本选择二.环境准备三.工具的选择四.第一个 hello go4.1 开发4.2 编译4.3 编译运行4.4 直接安装 五.用 go 快速搭建 webserver六.调用外部三方方法七.go vs java 的执行 前言 专栏旨在利用现有的 java 体系内容去完成 go 语言的学习. 本次行文是在 https://go.dev/doc…

C# 标识符、变量的命名规范

标识符: 定义的变量名 方法名 类名 等用于识别的内容(变量的命名规范) 命名注意事项: 1.不能以数字开头 2.不能有特殊符号(下划线除外) 3.不能有程序关键字 4.不能重复使用一个名字 命名方法(常用): 驼峰命名法 帕斯卡命名法 不建议使用拼音或汉字命名

迈向2024年,投资无人售货机的盈利能力

在科技进步的浪潮下,无人值守自动售货商店已悄然引领了零售业的新风尚。但关于在2024年开设此类商店是否依旧能实现盈利,这需要一番深思熟虑的分析。 首先不可否认,无人售货机拥有多项显著优势。它打破了传统零售的时间与地点局限&#xff0…

[Linux] 进程概念

目录 1.冯诺依曼硬件体系结构 2.操作系统(OS) 3.系统接口 4.进程的概念 5.进程状态 6.四个其他概念 7.环境变量 8.进程地址空间 1.冯诺依曼硬件体系结构 在冯诺依曼体系结构中,计算机是由输入、输出、存储设备和中央处理器cpu组成的。图中体结…

Unity 自定义Web GL 发布模板

前言 使用讯飞语音识别时,发布Web GL 平台后需要在index.html 中添加相应的script 标签,但每次发布完添加比较麻烦,添加一个发布模板就可以不必每次发布完再手动添加修改。 实现 在Assets 文件夹下新建一个文件夹,重命名为WebG…

重构2:重构的原则之笔记

最近在看重构2:改善既有代码的设计这本书,对于代码重构指导非常有帮助,然后也是做个笔记记录下,以下是我阅读本书的前两章的时候整理的思维导图:

【示例】MySQL-4类SQL语言-DQL

文章目录 前言DQL | Data Query Language总述 | 涵盖几乎所有关键字的DQL语句单表查询关键字 | 用在Select后面查询内容:表字段查询内容:聚合函数查询内容:[排序函数] [聚合函数] 窗口函数查询内容:表字段函数 关键字 | 用在Where…

【MySQL精通之路】InnoDB(18)-备份与恢复

目录 1.InnoDB备份 1.1 热备份 1.2 冷备份 1.3 使用mysqldump的逻辑备份 2.InnoDB恢复 2.1 实时恢复 2.2 从数据损坏或磁盘故障中恢复 2.3 InnoDB崩溃恢复 2.3.1 表空间发现 2.3.2 Redolog应用程序 2.3.3 未完成交易的回滚 2.3.4 更改缓冲区合并 2.3.5 清除 2.4 …

GPT-3可以用于哪些行业

GPT-3的应用已经渗透到了多个行业,其广泛的用途和强大的能力使得它成为了各行各业的重要工具。以下是一些GPT-3的主要应用领域: 在线客服:GPT-3可以理解和生成人类语言,使得它能够更好地满足用户的需求。它可以根据用户的提问实时…

数据湖对比(hudi,iceberg,paimon,Delta)

Delta 数据湖 Delta 更新原理 update/delete/merge 实现均基于spark的join功能。 定位 做基于spark做流批一体的数据处理 缺点 本质为批处理。强绑定spark引擎。整体性能相较其他数据湖比较差 hudi 数据湖 hudi 更新原理 通过hudi自定义的主键索引hoodiekey 布隆过…

Ali-Sentinel-集群流控

归档 GitHub: Ali-Sentinel-集群流控 测试 参考:热点流控-测试 新建 ClusterDemoApplication2 public class ClusterDemoApplication2 {public static void main(String[] args) {System.setProperty("csp.sentinel.dashboard.server", "127.0.…

华为手机卡顿(仅针对于部分人来说,我也不清楚是否真的有用)

关机! 之前一段时间手机变得特别卡顿,然后网上搜了一堆教程一点用没有,结果因为昨天下午在考试所以把手机关机了一个多小时,再打开之后手机就变得很流畅,原因不详,但效果显著,如有需要可尝试一…

docker使用PostgreSQL容器

要执行 db/migrations/ 目录下的多个 SQL 文件以迁移数据库,可以按照以下步骤进行: 1 确认 PostgreSQL 容器正在运行: 确认你已经启动了 PostgreSQL 容器并且它在运行: docker ps -a2 确认容器 beaconchain 是 Up 状态。 将 SQ…

docker 挂载运行镜像

文章目录 前言docker 挂载运行镜像1. 作用2. 命令3. 测试 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢…

软考 软件设计师 场景分析题 速成篇

文章目录 试题一:数据流图💖 基本图形元素1. 外部实体2. 数据存储3. 加工4. 数据流 📚 例题(1)实体名称(2)数据存储名称(3)数据流① 父子图平衡② 加工有输入有输出④ 数…

在Windows10中重命名文件和文件夹的6种方法,有你熟悉和不熟悉的

序言 你可以通过多种方式在Windows 10上重命名文件。如果每次你想更改文件名时仍右键单击并选择“重命名”,那么我们有一些技巧可以加快更改速度。 使用文件资源管理器重命名文件和文件夹 Windows 10的文件资源管理器是一个功能强大的工具。你知道吗,有四种不同的方法可以…