《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…

迈向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:改善既有代码的设计这本书,对于代码重构指导非常有帮助,然后也是做个笔记记录下,以下是我阅读本书的前两章的时候整理的思维导图:

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

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

docker 挂载运行镜像

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

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

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

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

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

CSS【常用CSS样式、盒子模型、定位、浮动 、扩展样式】--学习JavaEE的day46

day46 CSS 练习 页面实现&#xff1a; 分析&#xff1a; 未优化&#xff1a; 优化&#xff1a; 参考代码&#xff1a;&#xff08;包含样式优化–选择器CSS属性&#xff09; 先写上table方便实现&#xff0c;之后再去除即可 name没有服务器&#xff0c;可暂时不写 <!…

微软开源多模态大模型Phi-3-vision,微调实战来了

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型& AIGC 技术趋势、大模型& AIGC 落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了…

零部件销售|基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现(源码+数据库+文档)

轻型卡车零部件销售平台 目录 基于SSM&#xff0b;vue的轻型卡车零部件销售平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

stream( ).collect ( Collectors.groupingBy ( ) ) 的用法

文章目录 第一种解释1、基本用法2、指定值收集器3、多级分组4、常见应用场景和用处 第二种解释1、基本语法2、示例3、更复杂的用法 第一种解释 Collectors.groupingBy 是 Java 8 引入的 Stream API 中的一个收集器&#xff08;Collector&#xff09;&#xff0c;它用于将流&am…

【笔记】Qt 按钮控件介绍(QPushButton,QCheckBox,QToolButton)

文章目录 QAbstractButton 抽象类(父类)QAbstractButton 类中的属性QAbstractButton 类中的函数QAbstractButton 类中的信号QAbstractButton 类中的槽 QPushButton 类(标准按钮)QPushButton 类中的属性QPushButton 类中的函数、槽 QCheckBox 类(复选按钮)QCheckBox 类的属性QCh…

Html中,想利用JS引入Jquery文件;$.getScript()无效

在使用$.getScript()时&#xff0c;会爆出错误&#xff1a;ReferenceError: $ is not defined &#xff0c;这是因为没有在JS文件前引入Jquery。 那么可以这样使用&#xff1a;(这个方式只适合放在页面代码最后面使用) (function () {var script window.document.createEleme…

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

ComfyUI 本地部署指南:概念、部署过程、生成图片、共享 WebUI 模型

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要讲解 ComfyUI 的本地部署指南&#xff0c;内容主要包括&#xff1a;ComfyUI 的概念、ComfyUI 本地部署过程、使…