第5章 【MySQL】InnoDB数据页结构

news2025/1/11 11:45:56

5.1 不同类型的页简介

页是InnoDB 管理存储空间的基本单位,一个页的大小一般是 16KB 。InnoDB 为了不同的目的而设计了许多种不同类型的 页 ,比如存放表空间头部信息的页,存放 Insert Buffer信息的页,存放 INODE 信息的页,存放 undo 日志信息的页等等。

5.2 数据页结构的快速浏览

数据页代表的这块 16KB 大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:

                  

从图中可以看出,一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分,有的部分占用的字节数是确定的,有的部分占用的字节数是不确定的。下边我们用表格的方式来大致描述一下这7个部分都存储一些什么内容:

名称

中文名

占用空间大小

简单描述

File Header

文件头部

38 字节

页的一些通用信息

Page Header

页面头部

56 字节

数据页专有的一些信息

Infimum + Supremum

最小记录和最大记录

26 字节

两个虚拟的行记录

User Records

用户记录

不确定

实际存储的行记录内容

Free Space

空闲空间

不确定

页中尚未使用的空间

Page Directory

页面目录

不确定

页中的某些记录的相对位置

File Trailer

文件尾部

8 字节

校验页是否完整

5.3 记录在页中的存储

在页的7个组成部分中,我们自己存储的记录会按照我们指定的 行格式 存储到 User Records 部分。但是在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到 User Records 部分,当 Free Space 部分的空间全部被 User Records 部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了,这个过程的图示如下:

5.3.1 记录头信息的秘密

先创建一个表:

这个新创建的 page_demo 表有3个列,其中 c1 和 c2 列是用来存储整数的, c3 列是用来存储字符串的。需要注意的是,我们把 c1 列指定为主键,所以在具体的行格式中InnoDB就没必要为我们去创建那个所谓的 row_id 隐藏列了。而且我们为这个表指定了 ascii 字符集以及 Compact 的行格式。所以这个表中记录的行格式示意图就是这样的:

下边我们试着向 page_demo 表中插入几条记录:

其中页的一些属性在下面部分:

delete_mask

这个属性标记着当前记录是否被删除,占用1个二进制位,值为 0 的时候代表记录并没有被删除,为 1 的时候代表记录被删除掉了。

min_rec_mask

B+树的每层非叶子节点中的最小记录都会添加该标记。

heap_no

这个属性表示当前记录在本 页 中的位置,从图中可以看出来,我们插入的4条记录在本 页 中的位置分别是: 2 、 3 、 4 、 5 。他们自动给每个页里边儿加了两个记录,由于这两个记录并不是我们自己插入的,所以有时候也称为 伪记录 或者 虚拟记录 。这两个伪记录一个代表 最小记录 ,一个代表 最大记录。

记录也可以比大小,对于一条完整的记录来说,比较记录的大小就是比较 主键 的大小。比方说我们插入的4行记录的主键值分别是: 1 、 2 、 3 、 4 ,这也就意味着这4条记录的大小从小到大依次递增。

但是不管我们向 页 中插入了多少自己的记录,设计 InnoDB 的大叔们都规定他们定义的两条伪记录分别为最小记录与最大记录。这两条记录的构造十分简单,都是由5字节大小的 记录头信息 和8字节大小的一个固定的部分组成的,如图所示

           

由于这两条记录不是我们自己定义的记录,所以它们并不存放在 页 的 User Records 部分,他们被单独放在一个称为 Infimum + Supremum 的部分。

不论我们怎么对页中的记录做增删改操作,InnoDB始终会维护一条记录的单链表,链表中的各个节点是按照主键值由小到大的顺序连接起来的。

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

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

相关文章

《低代码指南》——低代码+AI,智能化的构建数字应用

LCHub低代码社区:对低代码平台在AI领域的应用及其成果进行了深入阐述。他强调,在AI时代,工程化的重要性不容忽视,同时,复杂系统建设和数据模型驱动开发也占据了核心地位。 顾伟不仅深入探讨了低代码零代码平台在业界的不同分类和使用场景,还详细解读了低代码平台的功能架…

区块链实验室(22) - go-sdk访问Fisco的案例

在前面的案例中(区块链实验室(21) - Go语言采用SDK访问Fisco的案例),go程序调用FISCO SDK的参数固化在程序中,现将其改造如下。 package mainimport ("flag""fmt""log""github.com/FISCO-BCOS/go-sdk/client"&…

Ubuntu22.04安装及显卡驱动问题

自己有window系统,想搞个ubuntu系统玩玩 一、Ubuntu22.04安装 首先去官网下载ubuntu系统,我下载的是22.04 https://cn.ubuntu.com/download/desktop 准备一个启动盘制作器Rufus,将下载好的镜像烤制到U盘 制作完u盘,进入bios更…

第27章 非阻塞IO实验

上个章节中我们学习了阻塞IO,阻塞IO是通过等待队列来实现的,那么如何让驱动实现非阻塞呢?带着疑问,让我们开始本章节非阻塞IO的学习吧! 27.1 非阻塞IO简介 应用程序可以使用如下所示示例代码来实现阻塞访问&#xff…

浅谈综合管廊智慧运维管理平台应用研究

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:为提升综合管廊运维管理水平,实现管理的数字化转型,采用综合监测系统、BIMGIS 可视化系统、智能机器人巡检、结构安全监测等技术,搭建实时监控、应急管理、数据分析等多功能…

1254. 统计封闭岛屿的数目

二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。 请返回 封闭岛屿 的数目。 示例 1: 输入&…

健身用哪种耳机好、健身运动耳机推荐

对于和我一样热爱健身和运动的人来说,音乐就像一种调动情绪的"兴奋剂",在戴上耳机、聆听着动感的音乐时,我们能够感受到肌肉的收缩,完全沉浸在自己的世界中。这种状态让我们的训练状态达到巅峰,快乐倍增。因…

c++ 学习 之 类内成员变量和成员函数分开存储

正文 一个空的类占多少内存 看代码 #define CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;// 在c 中类内成员变量和成员函数分开存储 class Person {};void test() {Person p;// 空对象占的内存为 1 &#xff0c;是为了区分空对象占内存的位置cout…

多线程-阻塞队列

在这篇博客中我们接触的队列都是非阻塞队列&#xff0c;比如PriorityQueue、LinkedList&#xff08;LinkedList是双向链表&#xff0c;它实现了Dequeue接口&#xff09;。 使用非阻塞队列的时候有一个很大问题就是&#xff1a;它不会对当前线程产生阻塞&#xff0c;那么在面对类…

飞行动力学 - 第19节-part2-尾旋及改出 之 基础点摘要

飞行动力学 - 第19节-part2-尾旋及改出 之 基础点摘要 1. 尾旋2. 尾旋进入3. 尾旋改出4. 参考资料 1. 尾旋 尾旋是一种绕垂直轴自动旋转、下降的特殊失速现象。 特点&#xff1a; 尾旋半径半个翼展长度旋转速度120 度/秒 2. 尾旋进入 不同型号飞机&#xff0c;其尾旋特点不…

2023-简单点-什么是protobuf?

protobuf mother: 谷歌 作用 序列化 人话&#xff1a; 存储数据的一种结构 优势在&#xff1f; 类型安全 易用性好 序列化/反序列性能好 兼容性好 不仅可以定义结构体&#xff0c;还可以定义rpc服务接口 劣势在&#xff1f; 可读性较差&#xff1a;没有schema的情况下&a…

element的el-select给下拉框添加背景

第一步 :popper-append-to-body"false" <el-selectv-model"value"placeholder"请选择":popper-append-to-body"false"><el-optionv-for"item in options":key"item.value":label"item.label&quo…

web自动化测试工具之Selenium的使用

Selenium的使用 Selenium概述工作原理应用场景安装浏览器驱动 基本使用安装Selenium模块注意点使用分析代码实现 常见方法driver对象定位标签元素与获取标签对象获取文本内容与属性值 使用无界面浏览器使用pyantomjs驱动设置chrome启动参数 其他操作窗口切换ifrme切换设置User-…

ERR_PNPM_NO_GLOBAL_BIN_DIR Unable to find the global bin directory

错误提示 ERROR Unable to find the global bin directory Run "pnpm setup"to create it automatically, or set the global-bin-dir setting, or the PNPM HOME env variable.The global bin directory should be in the PATH.错误&#xff0c;找不到全局bin目录 …

Web跨域问题

目录 一、引言二、跨域问题1.同源策略2.跨域3.出现跨域问题的情况 三、解决方案1.普通web&#xff0c;使用Filter过滤器2.SpringBoot项目&#xff0c;使用CrossOrigin注解 四、示例 一、引言 在web开发的过程中&#xff0c;因为前后端的分离我们经常会遇到跨域问题&#xff0c…

私人问答网站搭建指南:Ubuntu+Cpolar+Tipas

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语 前…

Spring MVC 六 - DispatcherServlet处理请求过程

前面讲过了DispatcherServlet的初始化过程&#xff08;源码角度的DispatcherServlet的具体初始化过程还没说&#xff0c;先放一放&#xff09;&#xff0c;今天说一下DispatcherServlet处理请求的过程。 处理过程 WebApplicationContext绑定在当前request属性上&#xff08;属…

SpringMVC多文件上传

文章目录 一、文件上传1.1 导入pom依赖1.2 配置文件上传解析器1.3 设置文件上传表单1.4 实现文件上传 二、文件下载三、多文件上传四、JRebel的使用 一、文件上传 1.1 导入pom依赖 <commons-fileupload.version>1.3.3</commons-fileupload.version><dependency…

springboot第40集:架构师写的代码,那叫一个优雅

事务的隔离性上&#xff0c;从低到高可能产生的读现象分别是&#xff1a;脏读、不可重复读、幻读。 脏读指读到了未提交的数据。 不可重复读指一次事务内的多次相同查询&#xff0c;读取到了不同的结果。 幻读师不可重复读的特殊场景。一次事务内的多次范围查询得到了不同的结果…

系统测试AC5. AC6. IAR和GCC调试效果,MDK AC6不开优化调试乱跳,甚至倒序执行

首先感谢大家对上一个视频的点评回复&#xff0c;非常有意义的讨论&#xff0c;这次AC6的表现更新惊呆&#xff0c;不开优化都可以乱跳。 【实验目的】 同样的程序代码&#xff0c;目的是测试C环境的调试现象。 【实验版本】 IAR版本 &#xff1a;9.3x MDK版本&#xff1a;5…