5.5 【MySQL】Page Header(页面头部)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 5.5 【MySQL】Page Header(页面头部)

在页中定义了一个叫Page Header的部分,它是页结构的第二部分,这个部分占用固定的56个字节,专门存储各种状态信息,具体如下:


名称

占用空间大小

描述

PAGE_N_DIR_SLOTS

2 字节

还未使用的空间最小地址,也就是说从该地址之后就是 Free Space

PAGE_HEAP_TOP

2 字节

还未使用的空间最小地址,也就是说从该地址之后就是 Free Space

PAGE_N_HEAP

2 字节

本页中的记录的数量(包括最小和最大记录以及标记为删除的记录)

PAGE_N_HEAP

2 字节

第一个已经标记为删除的记录地址(各个已删除的记录通过 next_record 也会组成一个单链表,这个单链表中的记录可以被重新利用)

PAGE_GARBAGE

2 字节

最后插入记录的位置

PAGE_LAST_INSERT

2 字节

最后插入记录的位置

PAGE_DIRECTION

2 字节

记录插入的方向

PAGE_N_DIRECTION

2 字节

一个方向连续插入的记录数量

PAGE_N_RECS

2 字节

该页中记录的数量(不包括最小和最大记录以及被标记为删除的记录)

PAGE_MAX_TRX_ID

8 字节

修改当前页的最大事务ID,该值仅在二级索引中定义

PAGE_LEVEL

2 字节

当前页在B+树中所处的层级

PAGE_INDEX_ID

8 字节

索引ID,表示当前页属于哪个索引

PAGE_BTR_SEG_LEAF

10 字节

B+树叶子段的头部信息,仅在B+树的Root页定义

PAGE_BTR_SEG_TOP

10 字节

B+树非叶子段的头部信息,仅在B+树的Root页定义

PAGE_DIRECTION


假如新插入的一条记录的主键值比上一条记录的主键值大,我们说这条记录的插入方向是右边,反之则是左边。用来表示最后一条记录插入方向的状态就是 PAGE_DIRECTION 。


PAGE_N_DIRECTION


假设连续几次插入新记录的方向都是一致的, InnoDB 会把沿着同一个方向插入记录的条数记下来,这个条数就用 PAGE_N_DIRECTION 这个状态表示。当然,如果最后一条记录的插入方向改变了的话,这个状态的值会被清零重新统计。

5.6 File Header(文件头部)

上边说的 Page Header 是专门针对 数据页 记录的各种状态信息,比方说页里头有多少个记录了,有多少个槽。现在描述的 File Header 针对各种类型的页都通用,也就是说不同类型的页都会以 File Header 作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页、下一个页是谁。这部分占用固定的38个字节,是由下边这些内容组成的:

名称

占用空间大小

描述

FIL_PAGE_SPACE_OR_CHKSUM

4 字节

页的校验和(checksum值)

FIL_PAGE_OFFSET

4 字节

页号

FIL_PAGE_PREV

4 字节

上一个页的页号

FIL_PAGE_NEXT

4 字节

上一个页的页号

FIL_PAGE_LSN

8 字节

页面被最后修改时对应的日志序列位置(英文名是:Log SequenceNumber)

FIL_PAGE_TYPE

2 字节

该页的类型

FIL_PAGE_FILE_FLUSH_LSN

8 字节

仅在系统表空间的一个页中定义,代表文件至少被刷新到了对应的LSN值

FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID

4 字节

页属于哪个表空间

对照着这个表格,我们看几个目前比较重要的部分:


FIL_PAGE_SPACE_OR_CHKSUM


这个代表当前页面的校验和(checksum)。啥是个校验和?就是对于一个很长很长的字节串来说,我们会通过某种算法来计算一个比较短的值来代表这个很长的字节串,这个比较短的值就称为 校验和 。这样在比较两个很长的字节串之前先比较这两个长字节串的校验和,如果校验和都不一样两个长字节串肯定是不同的,所以省去了直接比较两个比较长的字节串的时间损耗。


FIL_PAGE_OFFSET


每一个 页 都有一个单独的页号,就跟你的身份证号码一样, InnoDB 通过页号来可以唯一定位一个 页 。


FIL_PAGE_TYPE


这个代表当前 页 的类型,我们前边说过, InnoDB 为了不同的目的而把页分为不同的类型,我们上边介绍的其实都是存储记录的 数据页 ,其实还有很多别的类型的页,具体如下表: |类型名称|十六进制|描述| |:--:|:--:|:--:| | FIL_PAGE_TYPE_ALLOCATED |0x0000|最新分配,还没使用| | FIL_PAGE_UNDO_LOG |0x0002|Undo日志页|| FIL_PAGE_INODE |0x0003|段信息节点| | FIL_PAGE_IBUF_FREE_LIST |0x0004|Insert Buffer空闲列表|| FIL_PAGE_IBUF_BITMAP |0x0005|Insert Buffer位图| | FIL_PAGE_TYPE_SYS |0x0006|系统页|| FIL_PAGE_TYPE_TRX_SYS |0x0007|事务系统数据| | FIL_PAGE_TYPE_FSP_HDR |0x0008|表空间头部信息|| FIL_PAGE_TYPE_XDES |0x0009|扩展描述页| | FIL_PAGE_TYPE_BLOB |0x000A|BLOB页|| FIL_PAGE_INDEX |0x45BF|索引页,也就是我们所说的 数据页 |


我们存放记录的数据页的类型其实是 FIL_PAGE_INDEX ,也就是所谓的 索引页 。


FIL_PAGE_PREV 和 FIL_PAGE_NEXT


InnoDB 都是以页为单位存放数据的,有时候我们存放某种类型的数据占用的空间非常大(比方说一张表中可以有成千上万条记录), InnoDB 可能不可以一次性为这么多数据分配一个非常大的存储空间,如果分散到多个不连续的页中存储的话需要把这些页关联起来, FIL_PAGE_PREV 和 FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号。这样通过建立一个双向链表把许许多多的页就都串联起来了,而无需这些页在物理上真正连着。需要注意的是,并不是所有类型的页都有上一个和下一个页的属性,不过我们本集中唠叨的 数据页 (也就是类型为 FIL_PAGE_INDEX 的页)是有这两个属性的,所以所有的数据页其实是一个双链表,就像这样:

5.7 File Trailer

我们知道 InnoDB 存储引擎会把数据存储到磁盘上,但是磁盘速度太慢,需要以 页 为单位把数据加载到内存中处理,如果该页中的数据在内存中被修改了,那么在修改后的某个时间需要把数据同步到磁盘中。但是在同步了一半的时候中断电了咋办,这不是莫名尴尬么?为了检测一个页是否完整(也就是在同步的时候有没有发生只同步一半的尴尬情况),设计 InnoDB 的大叔们在每个页的尾部都加了一个 File Trailer 部分,这个部分由 8 个字节组成,可以分成2个小部分:


前4个字节代表页的校验和

后4个字节代表页面被最后修改时对应的日志序列位置(LSN)

5.8 总结

1. InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做 数据页 。


2. 一个数据页可以被大致划分为7个部分,分别是


File Header ,表示页的一些通用信息,占固定的38字节。


Page Header ,表示数据页专有的一些信息,占固定的56个字节。


Infimum + Supremum ,两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的 26 个字节。


User Records :真实存储我们插入的记录的部分,大小不固定。


Free Space :页中尚未使用的部分,大小不确定。


Page Directory :页中的某些记录相对位置,也就是各个槽在页面中的地址偏移量,大小不固定,插入的记录越多,这个部分占用的空间越多。


File Trailer :用于检验页是否完整的部分,占用固定的8个字节。


3. 每个记录的头信息中都有一个 next_record 属性,从而使页中的所有记录串联成一个 单链表 。


4. InnoDB 会为把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个 槽 ,存放在Page Directory 中,所以在一个页中根据主键查找记录是非常快的,分为两步:


通过二分法确定该记录所在的槽。


通过记录的next_record属性遍历该槽所在的组中的各个记录。


5. 每个数据页的 File Header 部分都有上一个和下一个页的编号,所以所有的数据页会组成一个 双链表 。


6. 为保证从内存中同步到磁盘的页的完整性,在页的首部和尾部都会存储页中数据的校验和和页面最后修改时对应的 LSN 值,如果首部和尾部的校验和和 LSN 值校验不成功的话,就说明同步过程出现了问题。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
AnalyticDB MySQL新购页面融合升级,提供企业版购买选项
AnalyticDB MySQL新购页面升级,现推出企业版和基础版,不再区分湖仓版和数仓版。企业版(集群模式)和基础版(单机模式)融合了弹性模式和预留模式的功能,提供资源隔离、弹性扩展及高性能查询,适合开发测试和生产环境,而基础版适用于小规模测试,不推荐用于生产环境。
AnalyticDB MySQL新购页面融合升级,提供企业版购买选项
|
6月前
|
SQL 分布式计算 关系型数据库
云原生数据仓库产品使用合集之可以把ADB MySQL湖仓版数据库做成页面查询的数据库吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
11月前
|
关系型数据库 MySQL Apache
【XAMPP】中mysql的admin页面打不开
【XAMPP】中mysql的admin页面打不开
|
移动开发 JavaScript 前端开发
前后端的展示页面.本项目采用了以下知识点.JSP Servlect HTML5 JQUERY JavaScript Css3 MYSQL Sping架包 和几个框架。(二)
前后端的展示页面.本项目采用了以下知识点.JSP Servlect HTML5 JQUERY JavaScript Css3 MYSQL Sping架包 和几个框架。
80 0
前后端的展示页面.本项目采用了以下知识点.JSP Servlect HTML5 JQUERY JavaScript Css3 MYSQL Sping架包 和几个框架。(二)
|
移动开发 JavaScript 前端开发
前后端的展示页面.本项目采用了以下知识点.JSP Servlect HTML5 JQUERY JavaScript Css3 MYSQL Sping架包 和几个框架。(一)
前后端的展示页面.本项目采用了以下知识点.JSP Servlect HTML5 JQUERY JavaScript Css3 MYSQL Sping架包 和几个框架。
90 0
前后端的展示页面.本项目采用了以下知识点.JSP Servlect HTML5 JQUERY JavaScript Css3 MYSQL Sping架包 和几个框架。(一)
|
SQL 前端开发 druid
|
数据库
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 数据库数据没法show再 Web页面上
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 数据库数据没法show再 Web页面上
109 0
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 数据库数据没法show再 Web页面上
|
关系型数据库 MySQL 数据库
Mysql页面crash问题复现&恢复方法
title: mysql页面crash问题复现&恢复方法 date: 2019-07-25 11:33:06 categories: Mysql 看到一个MYSQL单节点CRASH的案例,这里用MYSQL5.
1261 0
|
6天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
20 4
|
4天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
13 1