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

【详解】Spark数据倾斜问题由基础到深入详解-完美理解-费元星

数据倾斜定义:顾名思义,就是大量相似或相同数据聚集在一个块的节点里,导致计算和资源分配不均导致的计算缓慢(长尾)问题。 数据倾斜原因: count(distinct field) group by NULL 空值 Shuffle (概率最…

计算机二级考试题库(答案)

题目一:计算机网络基础 1.计算机网络的定义是什么? 计算机网络是指由通讯设备和不同类型计算机组成的计算机系统,利用传输介质,如电缆、光缆、无线等与通讯协议,实现计算机之间的信息传递和共享资源。 2. 内网和外网有什么区别?…

Vue2学习笔记(监视属性)

一、案例1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>监视属性</title><script type…

【Datagear】关于Datagear目前发现的部分限制

【背景】 Datagear是一款非常不错的开源可商用BI分析平台&#xff0c;市面上大多数贩卖的BI平台能做的它基本都能做&#xff0c;不能做的也可以通过自己编辑JS甚至写后端服务实现&#xff0c;有完整的用户和权限管理系统内置&#xff0c;是很不错的低成本实现企业BI需求的平台…

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 源代码 源码下载 作者&#xff1a;…

Java-easyExcel入门教程

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

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

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

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

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

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

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

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

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

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

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

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

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

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

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

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 等可解释性工具配合…

MySQL 表分区原理详解

MySQL中的表分区是一种将表的数据按照某种规则划分成多个更小、更易于管理的部分的技术。表分区可以使得查询、维护和优化大表变得更加高效。每个分区都可以看作是独立的表&#xff0c;但对用户来说仍然是单一的表的透明访问。 分区原理 透明性: 对于应用程序来说&#xff0c;…