MySQL 数据页详解

数据页是MySQL 中定义的的一个存储结构

数据页是保存数据行的容器

页的16KB的大小是MySQL的⼀个默认设置,可以适用于⼤多数场景,当然也可以根据自己的实际业务场景进行修改页的大小,通过系统变量 innodb_page_size 进行调整与查看,在调整页大小的时候需要保证设置的值是操作系统"数据块" 4KB的整数倍,从而保证通过操作系统和磁盘交互时"数据块"的完整性,不被分割或浪费,所以规定了 innodb_page_size 可以设置的值,分别是 4096 、 8192 、 16384 、 32768 、 65536 ,对应 4KB 、 8KB 、 16KB 、 32KB 、64KB ;

1、数据页的属性

首先我们思考一下,数据页中的属性可能有哪些呢?

1、大小 -> 根据全局变量配置

2、属于哪个表空间 -> 关联对应的表空间ID

3、指定页的类型 -> 通过枚举或常量的方式指定

4、对页进行编号 -> 指定唯一标识

实际:

1. 页头 - File Header

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

• 上一页页号: 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 ,用于页的完整性校验

2. 页尾 - File Trailer

• 最近⼀次修改的LSN

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

如果在数据传输的过程中数据丢失或异常中断,导致⼀个数据⻚不完整就可以通过⻚头和⻚尾的校验和进⾏验证,验证算法默认使⽤ CRC32

可以发现,我们猜测的属性在实际结构中能一一对应(大小是固定的全局属性)。

在不同的使用场景中,页的结构也有所不同,在MySQL中有多种不同类型的页,但不论哪种类型的页都会包含页头(File Header)和⻚尾(File Trailer),在这页头和页尾之间的页主体信息根据不同的类型有不同的结构,最常⽤的就是用来存储数据和索引的"索引页",也叫做"数据页",页的主体信息使用数据"行"进行填充

2、数据之间如何进行关联

通过双向链表进行关联。

后面会详细讲解其他信息。

相关推荐
IT枫斗者枫哥3 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
Flynt3 小时前
"MySQL搜不动就上ES"?我先在50万行数据上测了它自带的ngram全文索引
mysql·elasticsearch·搜索引擎
Y003 小时前
PostgreSQL 的锁:为什么你的 ALTER TABLE 会卡住,以及怎么查
数据库·postgresql
imDwAaY4 小时前
Redo Log 和 Binlog 为什么需要两阶段提交?
后端·mysql
灰原喜欢柯南4 小时前
OceanBase 运维管理知识点——OCP 监控、诊断与变更控制
数据库·oceanbase
码农-0044 小时前
Springboot 集成 Ehcache操作数据库显示SQL语句设置
数据库·spring boot·sql
仍然.4 小时前
Redis---事务
数据库·redis
oradh4 小时前
Oracle 执行计划的阅读方法(二叉树结构来理解和阅读)
数据库·oracle·执行计划的阅读方法
SelectDB4 小时前
Doris 向量检索上线踩坑记录:七个排查现场与可直接复制的命令
大数据·数据库·数据分析
数据库小学妹4 小时前
MySQL深分页优化:LIMIT大偏移的根因分析与五种解法对比
数据库·mysql·性能优化