目录

一、页的大小

二、页的分类

三、页头和页尾

3.1 页头--File Header

3.2 页尾--File Trailer

3.3 LSN

四、数据行

五、页中数据的查询

六、事务和索引在页中的记录


一、页的大小

前面介绍了每个数据页默认大小为16KB,是操作系统“数据块” 4KB 的整数倍,那么只要保证页的大小是操作系统“数据块”大小的整数倍,我们也可以修改数据页的大小。

MySQL提供了一个专门的系统变量来控制页的大小,可以通过系统变量 innodb_page_size 进行调整与查看,在调整页大小时需要保证设置的值是操作系统“数据块”大小的整数倍,从而保证通过操作系统和磁盘交互时“数据块”的完整性,不被分割和浪费,所以规定了 innodb_page_size 的可以设置的值,分别为4096、8192、16384、32768、65536,对应 4KB 、8KB、16KB、32KB、64KB。

二、页的分类

InnoDB在不同的使用场景下定义多种不同类型的页,常用的有数据页、Undo Log页、Change Buffer页、Extent Descriptor(XDES)页、InnoDB段信息页等,其中最需要我们关注的就是数据页,由于InnoDB中有个概念叫“索引即数据”,所以也叫做索引页

不论哪种类型的页都具有页头(File Header)页尾(File Trailer)两个信息。

三、页头和页尾

页头和页尾用来描述文件相关信息,如下图所示:

3.1 页头--File Header

页号:FIL_PAGE_OFFSET 占用 4byte ,相当于页的身份证号,通过这个长度可以计算出每个InnoDB表中最多能有 2^(4*8)- 1 约42亿 个页,表空间的第一个页编号从0开始,之后的编号分别是1 2 3 4....以此类推,具体页的偏移量计算工程为 页号 * 每页大小。那么按照每个页默认16KB来计算,一个表空间最大的容量为 64TB ,这也是InnoDB表空间最大容量是 64TB 的原因。

上一页页号:FIL_PAGE_PREV

下一页页号:FIL_PAGE_NEXT 多个页通过这两个信息组成双向链表,即便不同的页地址不相连,也能通过链表连接。

表空间ID:FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,当前页属于哪个表空间。

页类型:FIL_PAGE_TYPE,数据页对应的页类型是 FIL_PAGE_INDEX = 0x45BF

最近一次修改的LSN:FIL_PAGE_LSN ,占用8byte

已被刷到磁盘的LSN:FIL_PAGE_FILE_FLUSH_LSN,占用8byte

校验和:FIL_PAGE_SPACE_OR_CHKSUM,用于页的完整性校验

3.2 页尾--File Trailer

最近一次修改的LSN

校验和:对应页头中的校验和。

如果在数据传输的过程中数据丢失或者异常中断,导致一个数据页不完整就可以使用页头页尾中的校验和来进行验证,验证算法默认使用 CRC32。

3.3 LSN

LSN:是“log Sequence Number” 的缩写,表示日志序号。用一个任意的、不断增加的值表示日志中记录的操作对应的时间点,用8字节的无符号整型表示。

四、数据行

数据行主要存储真实数据,为了方便数据的管理与描述,InnoDB在每个数据行中还添加了一些额外(管理)信息,于是每个 DYNAMIC 数据行都可以划分为两部分,一部分存储额外信息,一部分存储真实数据,额外信息部分包含变长字段列表和NULL值列表两个大小不确定的区域,以及固定占5字节及40BIT的的头信息区域,头信息中存储了行的基本信息,包括行在页内的位置 heap_no、行类型 record_type、下一行的地址偏移量 next_record 等六项信息,如下图所示:

数据行通过下一行的地址偏移量,将页中所有数据行组成一个单项链表,这里需要注意的是,地址偏移量指向的是下一行中真实数据的起始地址,这样做的好处是,向右是真实数据,向左是头信息,而无需额外的长度计算。

在了解了行的基本结构之后,那么当遍历页中的行时,从哪里开始哪里结束呢?为了解决这个问题,每当创建新页时都会自动分配两个行,一个是行类型为 2 的最小行 Infimun,heap_no 的值固定为0号, 和一个行类型为 的最大行 Supermun,heap_no 的值固定为1号,且这两个行不存储任何真实数据,而是作为数据行链表的头和尾,虽然不存储真实数据,但它们的数据结构和真实数据行一模一样,只不过数据区域存放的是代表他们身份的固定字符串 Infimun  Supermun ,新页中没有数据时,最小行的 next_record 直接连接最大行,最大行不连接任何行。

当一个新页插入数据时,heap_no 会从2开始递增,表示当前记录在页面堆中的相对位置,如果是真实数据则 record_type 为0,如果是索引目录(B+树非叶子节点)数据则 record_type 为 1,再将最小行连接第一个数据行,最后一行真实数据行连接最大行,这样数据行就形成了一个单向链表,更多的数据插入后,会按照主键从小到大的顺序连接,为了使页的结构更加清晰通常将页中有数据行的区域称为 用户数据区 User Records ,把未被数据行占用的区域称为 空闲区 Free Space

五、页中数据的查询

从头开始遍历时最简单的方法,也可以实现数据的查找,当按主键或索引查找某条数据时,从头行 Infimun 开始,沿着链表顺序一个个查找,但一个页有 16KB ,通常会存在数百行数据,每次都要遍历数百行无法满足高效查询。

为了提高查询效率,InnoDB采用二分查找的方式进行查找。

具体实现方法是,在每一个页中加入一个叫做 页目录 Page Directory 的结构,将页内包括头行、尾行在内的所有行进行分组,约定头行单独为一组,其他每个组最多八条数据,同时把每个组最后一行在页中的地址,按主键从小到大的顺序记录在页目录中,页目录中每一个位置称为一个槽,每个槽都对应了一个分组,这样在插入数据行完成连接后,一旦最后一个分组中的数据行超过八个时,就会分裂出一个新的分组,为了快速判断每个分组是否达到八个的上限,在每个分组最后一行用 n_owned 记录这个分组的行数,与此同时在页目录中创建一个新的槽,后续插入的行都遵守这个规则。

后续在查询某行时,就可以通过二分查找,先找到对应的槽,然后再槽内最多八个数据行中进行遍历,从而大幅度提高查询效率。

六、事务和索引在页中的记录

如下图所示:

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

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

相关文章

卡车检测数据集-700张图片交通运输管理 智能监控系统 道路安全监测

跌倒检测数据集-4500张图片📦 已发布目标检测数据集合集(持续更新)🚛 Deteccin de carpa 2 Computer Vision Project📌 数据集概览包含类别🎯 应用场景🖼 数据样本展示🔧 使用建议&a…

Python爬虫实战:研究pangu库相关技术

1. 引言 1.1 研究背景与意义 在数字化信息传播时代,中文文本排版质量直接影响信息传达效果。规范的排版要求中文与西文、数字间保持合理空格间距,但人工处理不仅效率低,且易出现一致性问题。随着互联网中文内容爆发式增长,传统人工排版已无法满足需求。Python 作为高效的…

day48-考试系统项目集群部署

1. ✅考试系统项目集群架构图负载均衡说明7层负载通过nginx对http请求进行转发(uri,ua,类型)4层负载对端口负载均衡(后端)2. 📝环境准备角色主机ip负载均衡lb01/lb02172.16.1.5/172.16.1.6前端web集群web01/web02172.1…

Redis+Caffeine双层缓存策略对比与实践指南

RedisCaffeine双层缓存策略对比与实践指南在高并发场景下,缓存是提升系统性能和并发处理能力的关键手段。常见的缓存方案包括远程缓存(如Redis)和本地缓存(如Caffeine)。单层缓存各有优劣,结合两者优势的双…

FastAPI+React19 ERP系统实战 第02期

一、搭建环境 1.1 创建Python虚拟环境 切换Python版本: pyenv local 3.12创建虚拟环境: python -m venv venv激活虚拟环境: venv\Scripts\activate1.2 安装FastAPI项目依赖 requirements.txt fastapi==0.109.1

百度AI文心大模型4.5系列开源模型评测,从安装部署到应用体验

2025年6月30日,百度突然宣布,将旗下最新的大语言模型文心大模型4.5(ERNIE 4.5)全系列开源,震动整个AI行业。百度在GitCode平台上开源了文心大模型4.5系列,包括ERNIE-4.5-VL-424B-A47B-Base-PT等多个型号。此…

windows安装maven环境

在maven官网下载安装包 https://maven.apache.org/download.cgi 下载完成后安装maven,一般下载编辑好的 创建个maven目录解压出来即可 配置环境变量 根据刚刚的安装路径,新建一个命名为MAVEN_HOME的系统变量 新建完成点开系统变量的Path项,…

MySQL(117)何进行数据库安全加密?

数据库安全加密是保护敏感数据免受未授权访问的重要手段。以下是一个详细深入的步骤,介绍如何进行数据库安全加密,包括数据传输加密和数据存储加密。 一. 数据传输加密 确保数据在传输过程中被加密,以防止中间人攻击。我们以MySQL为例&#x…

工程化实践——标准化Eslint、PrettierTS

前端工程化中的标准化工具(如Prettier、ESLint、Husky等)虽然大幅提升了开发效率和代码质量,但在实际使用中也存在一些限制和挑战。以下从工具特性、团队协作、开发体验等维度详细分析常见限制,并以Prettier为核心举例说明&#x…

应急响应靶场——web3 ——知攻善防实验室

前景需要: 小苕在省护值守中,在灵机一动情况下把设备停掉了,甲方问:为什么要停设备?小苕说:我第六感告诉我,这机器可能被黑了。这是他的服务器,请你找出以下内容作为通关条件&#…

Ubuntu:Tomcat里面的catalina.sh

认识catalina.sh 1 启动Tomcat catalina.sh start相当于startup.sh 2 停止Tomcat catalina.sh stop相当于shutdown.sh 3 前台运行Tomcat 一般用于调试 catalina.sh run4 Tomcat脚本 编辑如下脚本run_tomcat.sh 里面的一些HOME位置改成自己的 #!/bin/shWORKDIR$(cd $(dirname $0…

【机器学习深度学习】模型微调时的4大基础评估指标(1)

目录 前言:基础评估指标(从 “对与错” 到 “准与全”) 一、基础评估4大指标 二、类比理解 2.1 准确率(Accuracy):整体对的比例 2.2 精确率(Precision):你说是垃圾的…

关于 栈帧变化完整流程图(函数嵌套)

一、什么是栈帧(Stack Frame) 当一个函数被调用时,会在栈上开辟一段空间,叫做 栈帧。 每个栈帧保存了: 函数的参数 返回地址(从哪里跳回来) 上一个栈帧的栈底指针(保存调用者的 E…

new与malloc[c++面试系列]

new与malloc的区别new顺从c的思想,在堆区申请一个对象,因此它会调用对象的构造函数进行初始化,它也应该调用构造函数;malloc在堆区申请一块空间,用于存放资源new无需指定对象大小,可以自动计算对象大小进行…

Go语言的sync.Once和sync.Cond

一.sync.OnceOnce(单次执行)用途:确保某个操作只执行一次(如初始化配置)核心方法:Do(f func()):保证 f只执行一次package mainimport ("fmt""sync" )var (config map[strin…

java整合itext pdf实现自定义PDF文件格式导出

springBoot结合itext pdf实现自定义PDF文件格式导出背景需求&#xff1a;使用PDF导出指定人员对应周次的打卡记录&#xff0c;每周对应星期几打卡过就打“√”。如下图&#xff1a;1、导入依赖导入itextpdf依赖<!-- itex PDF --> <dependency><groupId>…

从0开始学习计算机视觉--Day07--神经网络

当我们输入的变量是一个比较大的向量&#xff08;比如有4096项&#xff09;&#xff0c;函数是求返回输入的最大值&#xff0c;要求的权重矩阵的梯度就是4096 * 4096的大小&#xff0c;而实际上我们的输入往往都不只有一个向量&#xff0c;那如果向量有一百个的话&#xff0c;是…

MySQL存储过程全解析

1、存储过程的概念 存储过程是事先经过编译并存储在数据库中的一段sql语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理效率是很有好处。 2、存储过程的优点 存储过程是通…

后端密码加密:守护用户数据的钢铁长城

&#x1f512;“系统被拖库了&#xff01;” 这可能是开发者最恐惧的噩梦。而当用户密码以明文暴露时&#xff0c;灾难将席卷每个用户——密码重用的惯性会让黑客轻松攻破他们在其他平台的账户。作为后端开发者&#xff0c;我们握有守护用户安全的第一道钥匙&#xff1a;科学的…

Flutter 3.29+使用isar构建失败

执行命令&#xff1a;flutter build apk --release 报错 Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!FAILURE: Build failed with an exception. …