Mysql的页结构详解

1.数据库的存储结构:页

索引结构为我们提供了搞笑的查找方式,索引信息和数据记录都在保存在文件上的,准确地说,是保存在“页”结构中。

1.1磁盘与内存的基本交互单位:页

InnoDB将数据划分为若干个页,InnoDB中的页的默认大小是16kb。页是磁盘与内存交互的最小单位,也就是说,每次内存从磁盘读取数据,最少会读取一个页的内容,相应地,每次内存往磁盘写数据,也是最少一个页。通常情况下,一个页中往往会有多条记录,当我们要查询某个页中的一条记录时,内存会将这一页的数据都完整地加载过来,也就是说数据库IO操作的最小单位就是页。

1.2页结构描述

页a,页b,页c…这些页可以不在物理空间上保持连续,只需要通过双向指针进行关联,保持逻辑上的连续即可。每个数据页的记录都会按照主键值从小到大组成一个单向链表。每个页都会为其记录生成一个页目录 ,通过主键查找某条记录的时候,可以在页目录中通过二分查找快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
在这里插入图片描述

1.3页大小

在InnoDB引擎中,页的默认大小是16kb,我们可以通过如下命令来进行查看:show variables like 'innodb_page_size';
在这里插入图片描述

1.4页的上层结构

在数据库中,除页结构之外,还存在区(Extent)、段(Segment)和表空间(tableSpace)的概念。关系如下图:
在这里插入图片描述
区(Extent)是页的上级结构,通常来说,一个区中会分配64个连续的页。一个页是16kb,一个区也就是64*16kb=1mb。
段(segment)是区的上级结构,由一个或多个区组成,区在文件系统是一个连续分配的空间(在InnoDB中是64个连续的页),但是在段中不需要保证区和区是物理上连续的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。当我们创建表、索引的时候,就会创建相应的段。比如我们创建一张表,就会创建一个表段;创建一个索引,就会创建一个索引段。
表空间(tableSpace)是一个逻辑容器,表空间存储的对象是段,在一个表空间会有一个或多个段,但是一个段只会属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上划分,又可以分为 系统表空间、用户表空间、撤销表空间、临时表空间等。

2.页的内部结构

页如果按类型进行划分的话,可以分为 数据页(保存B+树节点)、系统页、undo页、事务数据页等。其中我们最常使用的是数据页。
数据页16kb的存储空间被分为7个部分,分别是文件头(File Header)、页头(Page Header)、最大最小记录(infimum和supremum)、用户记录(User Records)、空闲空间(Free Space)、页目录(Page Directory)和文件尾(File Tailer)。
页结构的示意图如下所示:
在这里插入图片描述
在这里插入图片描述

第1部分:文件头(File Header)和文件尾(File Tailer)

首先是 文件通用部分,文件头和文件尾。

文件头(38字节)

主要作用:描述各种页的通用信息。比如页的编号,其上一页、下一页是谁等。
结构:

名称占用空间大小描述
FIL_PAGE_SPACE_OR_CHECKSUM4字节页的校验和
FIL_PAGE_OFFSET4字节页号
FIL_PAGE_PREV4字节上一个页的页号
FIL_PAGE_NEXT4字节下一个页的页号
FIL_PAGE_LSN8字节页面最后被修改时对应的日志序列位置(Log Sequence Number)
FIL_PAGE_TYPE2字节页的类型
FIL_PAGE_FILE_FLUSH_LSN8字节仅在系统表空间中的一个页定义,代表文件至少被刷新到了对应的LSN值
FIL_PAGE_ARCH_LOG_NUM_OR_SPACE_ID4字节页属于哪个表空间
文件头 重要参数描述
FIL_PAGE_OFFSET(4字节)

页号,每一个页都有自己的唯一页号,类似我们的身份证,通过页号,InnoDB可以定位到唯一的页。

FIL_PAGE_TYPE(2字节)

代表页的当前类型。
下面是所有类型,常用的用粗体标示。

类型名称十六进制描述
FIL_PAGE_TYPE_ALLOCATED0x0000最新分配,还未使用
FIL_PAGE_UNDO_LOG0x0002Undo日志页
FIL_PAGE_INODE0x0003段信息节点
FIL_PAGE_IBUFF_FREE_LIST0x0004Insert Buffer空闲列表
FIL_PAGE_IBUFF_BITMAP0x0005Insert Buffer位图
FIL_PAGE_TYPE_SYS0x0006系统页
FIL_PAGE_TYPE_TRX_SYS0x0007事务系统页
FIL_PAGE_TYPE_FSP_HDR0x0008表空间头部信息
FIL_PAGE_TYPE_XDES0x0009拓展描述页
FIL_PAGE_TYPE_BLOB0x000A溢出页
FIL_PAGE_INDEX0x45BF索引页,也就是我们说的数据页
FILE_PAGE_PREV(4字节)和FILE_PAGE_NEXT(4字节)

页在物理空间上不一定是连续的,需要通过每个页节点保存其上一个页及下一个页的页号,来形成双向链表,以保证页在逻辑上的连续性。
在这里插入图片描述

FILE_PAGE_SPACE_OR_CHECKSUM(4字节)

代表当前页的校验和。所谓校验和,就是针对某两个比较长的字符串,我们要比较两个字符串是否相等的时候,不需要对两个字符串的每个字符进行一个一个的比较,只需要通过一定的算法,将两个字符串转换成较短的两个字符串,比较这两个字符串是否相等就行了,如果这两个短的字符串不行等,那么原本的两个字符串也肯定不相等。这样可以一定程度缩短校验时间。

文件头 和 文件尾 都有FILE_PAGE_SPACE_OR_CHECKSUM这个属性。

作用:内存和磁盘是以页为最小单位进行数据交互的,如果某个页在内存中被进行了一定的修改,在修改完成后的某个时间点,会将内存中的页回写到磁盘中。如果某个页的数据在回写到一半的时候,突然断电了,造成了该页数据的不完整。那么如何校验一个页的数据是否传输完整呢?就是通过比较文件头文件尾的FILE_PAGE_SPACE_OR_CHECKSUM。如二者的校验和(checksum)值不相等,则说明数据传输不完整,需要重新传输。否则就说明是完整传输。

具体流程:当一个页在内存中被进行了修改,在同步到磁盘之前,会现将校验和(checksum)计算出来,因为文件头(File Header)在页(page)之前,所以在页同步到磁盘之前,会先将文件头同步到磁盘,此时磁盘的校验和也会被同步过去。然后进行页数据的同步,页同步完后则会进行文件尾的同步。如果同步成功,那么文件头和文件尾的校验和应该是一致的。如果中间发生了断电之类的异常,导致数据只同步了一半,那么文件头的校验和是新的,文件尾的校验和是旧的,二者就会不一致,说明同步不完整。

FIL_PAGE_LSN(8字节)

页面最后被修改时对应的日志序列位置(Log Sequence Number).

文件尾(8字节)

  1. 前面4个字节代表页的校验和
    这部分主要是和File Header中的校验和进行验证
  2. 后面4个字节代表页面最后被修改时对应的日志序列位置(LSN)
    这部分主要也是为了校验页的完整性,如果文件尾和文件头的LSN值校验不成功的话,说明同步过程出现了问题。

第2部分:最大最小记录、用户记录、空闲空间

在这里插入图片描述

空闲空间(Free Space)

我们存储的记录会按照指定的行格式存储到User Records(用户记录)中。但在最开始生成页的时候,其实是没有User Records这个部分的。每当我们插入一条记录,都会从Free Space的储存空间中申请一个记录大小的空间分配到User Records。当Free Space的空间完全被User Records替代的话,就说明这个页已经使用完了,后续新增记录需要申请新的页。
在这里插入图片描述

用户记录(User Records)

User Records中的记录按照指定的行格式一条一条的储存在User Records中,相互之间形成单链表。

最小最大记录(Infimum和Supremum)

记录如何比较大小呢?其实就是比较记录的主键值,比如我们插入4条记录,主键值分别是1,2,3,4.那么这条记录就是一次递增的。
InnoDB规定的最小记录和最大记录构造十分简单,就是5字节的记录头信息和8字节的一个固定部分组成。如下图:
在这里插入图片描述
这两条记录不是我们定义的,所以这两条记录不存储在User Records中,而是储存在Infimum+Supremum中。
在这里插入图片描述

第3部分:页目录(Page Directory)、页头(Page Header)

3.1 页目录

为什么要有页目录?

在页中,记录是以单链表的形式存在的,单链表的特性就决定了其在新增、删除是比较快的,但是对于查找是比较慢的,需要一个一个遍历,时间复杂度为O(n)。对于这种情况,在页结构中单独设计了页目录,专门给记录做目录,通过二分查找的方式进行数据检索,提升查询效率。

工作原理
  1. 将所有记录分为几组,这些记录中包括最小和最大记录,但是不包括已经被标记删除的记录
  2. 第1组,也就是最小记录所在的分组,只有最小记录这一条记录。最后一组,也就是最大记录所在的分组,会有1-8条记录。其余组的记录数量在4-8之间。
  3. 每个组的最后一条记录会存储该组一共有多少条记录,作为n_owned字段的值。
  4. 页目录用来存储每组最后一条记录的地址偏移量,这些地址偏移量会按照先后顺序存储起来,每组的地址偏移量也被称之为槽(slot),每个槽相当于指针指向每个组的最后一条记录。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

2023年中国消费金融行业研究报告

第一章 行业概况 1.1 定义 中国消费金融行业,作为国家金融体系的重要组成部分,旨在为消费者提供多样化的金融产品和服务,以满足其消费需求。这一行业包括银行、消费金融公司、小额贷款公司等多种金融机构,涵盖了包括消费贷款在内…

html实现各种好看的鼠标滑过图片特效模板

文章目录 1.鼠标悬浮效果1.1 渐动效果1.2 渐变效果1.3 边框效果1.4 线行效果1.5 图标效果1.6 块状效果1.7 边线效果1.8 放大效果1.9 渐出效果1.10 痕迹效果1.11 交叉效果1.12 着重效果1.13 详展效果1.14 能动效果1.15 明细效果 2.主要源码2.1 源代码 源码下载 作者:…

Java-easyExcel入门教程

文章目录 前言一、简介二、使用步骤1. 引入依赖2. 前提准备3. 实现导出4. 实现导入 三、我所遇到的问题四、总结 前言 在日常开发中经常会遇到一些 excel 表导入导出的需求,以往会使用 POI 封装成工具类来处理这些导入导出的需求,但是 POI 在导入大文件…

Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解

✍面向读者:所有人 ✍所属专栏:Docker零基础入门专栏 目录 第 1 步:创建 Dockerfile 第 2 步:构建 Docker 镜像 第 3 步:运行 Docker 容器 第 4 步:验证输出 dockerfile命令详解 最佳实践 默认情况下…

matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航

1、内容简介 略 25-可以交流、咨询、答疑 2、内容说明 基于卡尔曼滤波的GPS-INS的数据融合的导航 "基于卡尔曼滤波的GPS-INS的数据融合的导航 基于卡尔曼滤波实现GPS-INS组合导航系统" 卡尔曼滤波、GPS、INS、数据融合、导航 3、仿真分析 4、参考论文 略 …

[github全教程]github版本控制最全教学------- 大厂找工作面试必备!

作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于新西兰奥克兰大学攻读IT硕士学位。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。跨领域…

如何精准操作无人机自动停机坪?

无人机自动停机坪通过自主导航和避障功能,实现了无人机的自主降落和起飞,在无人机技术领域起到了至关重要的作用。停机坪不仅仅是无人机的起降平台,还具备自动换电或充电等功能,为无人机的自动化提供了关键支持。为更有效地操作无…

ESP32-Web-Server编程-CSS 基础 2

ESP32-Web-Server编程-CSS 基础 2 概述 如上节所述,可以使用外部 CSS 文件来修饰指定的 HTML 文件。 外部引用 - 使用外部 CSS 文件。 当样式需要被应用到很多页面的时候,外部样式表将是理想的选择。使用外部样式表,就可以通过更改一个文件…

SQL Server 2016(基本概念和命令)

1、文件类型。 【1】主数据文件:数据库的启动信息。扩展名为".mdf"。 【2】次要(辅助)数据文件:主数据之外的数据都是次要数据文件。扩展名为".ndf"。 【3】事务日志文件:包含恢复数据库的所有事务…

python高级练习题库实验1(B)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目5代码实验结果题目总结题目1 打包糖果小游戏,用户输入糖果品牌与个数,还有一个盒子里面可以装多少个糖果,输出一些打印信息,如下图所示: 代码 print("Packaging lollies into…

CF1877 E. Autosynthesis 基环树dp

传送门:CF [前题提要]:一道基环树dp,但是题目有点绕,当时卡了我整整半天,到了第二天换了和清醒的脑子然后和别人讨论才整明白,故记录一下 题目很绕,故不再介绍. 首先对于这种下标和值有关系的题目.其实不难想到建图(CF上有大量这种 t r i c k trick trick),随便举个类似的题…

12月1日作业

代码整理&#xff0c;将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 #include <iostream>using namespace std;class Cloudy {friend bool operator!(const Cloudy &L,const Cloudy &R); private:int a; public:int b; public:Cloudy(){}Clo…

【Java】浅析FutureTask的核心方法get

前言 在进行多线程编程时&#xff0c;我们离不开两个重要的任务接口&#xff1a;Runnable、Callable。一个线程想要运行&#xff0c;首先它得知道它的任务是什么&#xff08;它要做什么&#xff09;&#xff0c;而这两个接口恰好是用于表示一个线程需要执行的任务。 Runnable和…

SHAP(三):在解释预测模型以寻求因果见解时要小心

SHAP&#xff08;三&#xff09;&#xff1a;在解释预测模型以寻求因果见解时要小心 与 Microsoft 的 Eleanor Dillon、Jacob LaRiviere、Scott Lundberg、Jonathan Roth 和 Vasilis Syrgkanis 合作撰写的关于因果关系和可解释机器学习的文章。 当与 SHAP 等可解释性工具配合…

Mac 安装 Django 并连接 MySQL

一、下载安装运行Django看官方教程就好了&#xff0c;网址&#xff1a;Django 安装_w3cschool 二、连接MySQL&#xff08;我用的是pymysql和mysqlclient&#xff09;&#xff1a; 1、创建好项目后找到这个文件 2、修改当中的连接信息&#xff0c;将这些信息改成你自己的就好了…

2023-12-01 AIGC-自动生成ppt的AI工具

摘要: 2023-12-01 AIGC-自动生成ppt-记录 自动生成ppt: BoardMix boardmix 一键生成ppt boardmix是一款基于云的ai设计软件&#xff0c;允许创建用于各种目的的自定义演示文稿、ai绘画&#xff0c;ai生成思维导图等。以下是它的一些功能&#xff1a; 可定制的模板 - 它有一个…

Redis基本命令

文章目录 第1关&#xff1a;字符串、列表与集合第2关&#xff1a;哈希与有序集合第3关&#xff1a;Redis基本事务与其他命令 第1关&#xff1a;字符串、列表与集合 编程要求 根据提示&#xff0c;在右侧Begin-End区域补充代码&#xff0c;完成任务分配的后端处理逻辑&#xff…

Python-docx 深入word源码 自定义页码页脚以动态显示总页数和当前页数

代码和效果图 先上能够正常显示页码页脚的Python代码和效果图&#xff0c;之后再解释原理和思路 from docx import Document from docx.shared import Pt from docx.oxml import OxmlElement from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn…

Elasticsearch:什么是非结构化数据?

非结构化数据定义 非结构化数据是指未按照设计的模型或结构组织的数据。 非结构化数据通常被归类为定性数据&#xff0c;可以是人类或机器生成的。 非结构化数据是最丰富的可用数据类型&#xff0c;经过分析后&#xff0c;可用于指导业务决策并在许多其他用例中实现业务目标。…