MySQL之InnoDB存储页的独立表空间解读

2025-06-26 17:50

本文主要是介绍MySQL之InnoDB存储页的独立表空间解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

1、背景

我们往一张表里插入的行数据是存储在页上的,一张页的大小为16KB,数据量大的时候一张页不可能存储完一张表里的所有数据,所以需要多张页来进行存储,这多张页所在的存储空间就叫表空间,表空间分为系统表空间独立表空间,接下来就讲一下独立表空间上是如何存储页的。

2、独立表空间

【1】php表空间大小

之前讲过页的组成,我们再来看一下页的通用部分File Header(38字节大小)的组成:

名称字节大小含义
FIL_PAGE_SPACE_OR_CHKSUM4页的校验和
FIL_PAGE_OFFSET4页号
FIL_PAGE_PREV4上一页
FIL_PAGE_NEXT4下一页
FIL_PAGE_LSN8页最后被修改时对应的日志序列位置
FIL_PAGE_TYPE2页类型
FIL_PAGE_FILE_FLUSH_LSN8仅在系统表空间的一个页中定义,代表文件执行被刷新到了对应的LSN值
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4页属于哪个表空间

File Header里的页号由4字节组成,也就是32位,所以一个表空间最多能存储232个页,每个页按照16KB的大小来算,一个表空间最多可以存储64TB的大小的数据

【2】区

表空间里每连续64个页组成一个区,一个页按16KB大小来算,一个区的大小就为64*16KB=1pythonMB,如下图表示:

MySQL之InnoDB存储页的独立表空间解读

【3】组

表空间上连续256个区就为一个组,区0到区255就为第一个组,区256到区511就为第二个组,剩下的以此内推,需要注意的是,第一个组的前三个页的类型是固定,其它组的前两个页类型是固定的,在讲这些页之前我们先看一下页的类型有几种:

类型含义
FIL_PAGE_UNDO_LOGUndo日志页
FIL_PAGE_INODE段信息节点
FIL_PAGE_IBUF_FREE_LISTInsert Buffer空闲列表
FIL_PAGE_IBUF_BITMAPInsert Buffer位图
FIL_PAGE_TYPE_SYS系统页
FIL_PAGE_TYPE_TRX_SYS事务系统数据
FIL_PAGE_TYPE_FSP_HDRandroid空间头部信息
FIL_PAGE_TYPE_XDES扩展描述页
FIL_PAGE_TYPE_BLOBBLOB页

再看组的表结构图,如下图:

MySQL之InnoDB存储页的独立表空间解读

【4】段

一个索引有叶子节点和非叶子节点,存放叶子节点所在区的集合就叫叶子段,存放非叶子节点所在区的集China编程合就叫非叶子段,一个索引有两个段。

【5】区的类型

段就是索引中叶子节点和非叶子节点所在区的集合,一个索引两个段,一个区64个页,数据量小的时候用一个区来作为存储单位十分浪费空间,所以就有了碎片区的概念,在数据量小的时候段就以碎片区中的页为单位来分配空间,数据量大的时候就以区为单位来分配存储空间,碎片区不属于任何段,并且碎片区里的页可以存储多个索引的数据,区的类型有如下几种:

区类型含义
FREE属于表空间,区中的页都没被使用
FREE_FRAG属于表空间,有可用页的碎片区
FULL_FRAG无可用页的碎片区
FSEG属于某个段的区

【6】XDES Entry区结构

InnoDB中每一个区都对应一个XDES Entry结构,其组成图如下:

MySQL之InnoDB存储页的独立表空间解读

XDES Entry结构字段含义如下:

XDES Entry字节大小含义
Segment ID8段的唯一编号,只有FSEG类型的区此字段才有用
List Node12指向上一个和下一个XDES Entry结构
State4FREE、FREE_FRAG、FULL_FRAG、FSEG四种区类型
Page State Bitmap1616字节对应的128比特位,其中每2个比特位对应一个区64个页中的一个页,2个比特位中第一个比特位代表该页是否被使用

List Node结构字段含义如下:

List Node字节大小含义
Prev Node Page Number4上一个XDES Entry结构所在的页
Prev Node Offset2上一个XDES Entry结构页内偏移量
Next Node Page Number4下一个XDES Entry结构所在的页
Next Node Offset2下一个XDES Entry结构页内偏移量

【7】XDES Entry链表

在数据量比较小的时候,段是以碎片区中的页为单位来分配存储空间的,插入数据方式如下:

  • 1、查找表空间中状态为FREE_FRAG的区,找到了就取出零碎的页把数据插进去,
  • 2、没找到就申请一个状态为FREE的区,将状态变为FREE_FRAG,再取出零碎的页将数据插入进去,
  • 3、之后再插入数据当没有零碎的页可用时状态就变为FULL_FRAG。

快速查找这3个类型的区通过3个链表来查找,这3个链表是属于表空间独有的,3个链表如下:

链表含义
FREE链表FREE状态的区对应的XDES Entry结构通过List Node组成的链表
FREE_FRAG链表FREE_FRAG状态的区对应的XDES Entry结构通过List Node组成的链表
FULL_FRAG链表FULL_FRAG状态的区对应的XDES Entry结构通过List Node组成的链表

当一个段中的数据超过32个零碎的页之后,就以区为单python位来分配存储空间了,此时每个段都涉及3个链表,注意每个段都有3个链表,3个链表如下:

链表含义
FREE链表同一个段中所有页都是空闲的区对应的XDES Entry结构组成一个链表
NOT_FULL链表同一个段中有空闲页的区对应的XDES Entry结构组成一个链表
FULL链表同一个段中没有有空闲页的区对应的XDES Entry结构组成一个链表

【8】XDES Entry链表基节点

为了快速找到XDES Entry链表的头和尾,InnoDB中设计了链表基节点结构List Base Node,其结构图如下:

MySQL之InnoDB存储页的独立表空间解读

【9】INODE Entry段结构

段也有一个对应的结构INODE Entry,其结构如图:

MySQL之InnoDB存储页的独立表空间解读

INODE Entry结构字段含义如下:

INODE Entry字节大小含义
Segment Id8段的唯一id
NOT_FULL_N_USED4NOT_FULL链表中已经使用了的页数
List Base Node For FREE List16对应段中的FREE链表
List Base Node For NOT_FULL List16对应段中的NOT_FULL链表
List Base Node For FULLList16对应段中的FULL链表
Magic Number4INODE Entry是否被初始化
Fragment Array Entry4零碎页页号,总共32个

【10】FIL_PAGE_TYPE_FSP_HDR页类型

表空间第一个组中第一个页的类型为FIL_PAGE_TYPE_FSP_HDR,结构如下:

MySQL之InnoDB存储页的独立表空间解读

FIL_PAGE_TYPE_FSP_HDR字段解释:

字段字节大小含义
File Header38页的通用信息
FIle Space Header112表空间的一些整体属性
XDES Entry10240256个区信息
Empty Space5986未使用的空间
File Trailer8校验页是否完整

File Space Header结构字段解释:

字段字节大小含义
Space ID4表空间ID
Not Used4未使用
Size4表空间占有的页数
FREE Limit4未被初始化的最小页号,大于等于此页号对应的区的XDES Entry结构都没被加入FREE链表
Space Flags4存储占用空间比较小的属性
FRAG_N_USED4FREE_FRAG链表中已使用的页数量
List Base Node for FREE List16FREE链表基节点
List Base Node for FREE_FRAG List16FREE_FRAG链表的基节点
List Base Node for FULL_FRAG List16FULL_FREG链表的基节点
Next Unused Segment ID8表空间中下一个未使用的段ID
List Base Node for SEG_INODES_FULL List16SEG_INODES_FULL链表的基节点
List Base Node for SEG_INODES_FREE List16SEG_INODES_FREE链表的基节点

【11】FIL_PAGE_IBUF_BITMAP页类型

表空间所有组的第二个页的类型为FIL_PAGE_IBUF_BITMAP,用于InnoDB存储引擎中事务日志缓冲区,与插入缓冲有关,后面再讲。

【12】FIL_PAGE_INODE页类型

第一组第三个页类型就为FIL_PAGE_INODE,用于存储段结构INODE Entry,其页结果如图:

MySQL之InnoDB存储页的独立表空间解读

FIL_PAGE_INODE页类型字段解释如下:

字段名字节大小含义
File Header38页的通用信息
List Node for INODE Page List12存储上一个INODE页和下一个INODE页
INODE Entry16128段信息,可以存储85个
Empty Space6未使用的空间
File Trailer8校验页是否完整

可以看到一个FIL_PAGE_INODE类型的页最多存储85个INODE Entry段结构,如果超过85个,就需要申请其它FIL_PAGE_INODE类型的页来进行存储了,所有FIL_PAGE_INODE类型的页会组成两个链表,这两个链表存储在FIL_PAGE_TYPE_FSP_HDR类型页的File Space Header结构里,链表如下:

链表含义
SEG_INODES_FULL链表FIL_PAGE_INODE类型的页中没有空闲空间来存储INODE Entry段结构
SEG_INODES_FREE链表FIL_PAGE_INODE类型的页中有空闲空间来存储INODE Entry段结构

存储一个INODE Entry结构的过程如下:

  • 1、从SEG_INODES_FULL链表中取出一个页去存储INODE Entry段结构,
  • 2、如果页上的INODE Entry段机构存储满了就放入SEG_INODES_FREE链表,
  • 3、如果SEG_INODES_FULL链表为空,就从表空间所属的FREE_FRAG链表中取出一个零碎页,修改其类型为FIL_PAGE_INODE,再放入SEG_INODES_FULL链表中。

【13】FIL_PAGE_TYPE_XDES页类型

表空间第一个组之外的其它组的第一个页类型为FIL_PAGE_TYPE_XDES,和FIL_PAGE_TYPE_FSP_HDR页类型差不多,相比少了一些其它属性,其结构图如下:

MySQL之InnoDB存储页的独立表空间解读

【14】索引关联INODE Entry段结构

一个索引有两个段,它们之间是这样关联起来的,数据页组成的页类型中有两个字段如下:

字段字节大小含义
PAGE_BTR_SEG_LEAF10B+树叶子段的头部信息,只在B+树的根页定义
PAGE_BTR_SEG_TOP10B+树非叶子段的头部信息,只在B+树的根页定义

这两个字段各对应一个Segment Header结构如下:

Segment Header字段字节大小含义
SpaceID ofthe INODE Entry4INODE Entry结构所在的表空间ID
Page Number of the INODE Entry4INODE Entry结构所在页号
Byte Offset of the INODE Ent2INODE Entry结构在页中偏移量

通过Segment Header就能很方便找到索引对应的INODE Entry段结构,并且只需要在B+树的根节点中定义这两字段。

3、总结

本文主要讲解独立表空间的组成部分,涉及到页、区、组还有各种结构等,后续可以再讲解系统表空间的组成,和独立表空间类似。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于MySQL之InnoDB存储页的独立表空间解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155222

相关文章

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

MySQL配置多主复制的实现步骤

《MySQL配置多主复制的实现步骤》多主复制是一种允许多个MySQL服务器同时接受写操作的复制方式,本文就来介绍一下MySQL配置多主复制的实现步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 环境准备2. 配置每台服务器2.1 修改每台服务器的配置文件3. 安装和配置插件4. 启动组复制4.

MySQL数据脱敏的实现方法

《MySQL数据脱敏的实现方法》本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下... 目录一. 数据脱敏的方法二. 字符替换脱敏1. 创建数据脱敏工具类三. 整合到数据库操作1. 创建服务类进行数据库

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

MYSQL中information_schema的使用

《MYSQL中information_schema的使用》information_schema是MySQL中的一个虚拟数据库,用于提供关于MySQL服务器及其数据库的元数,这些元数据包括数据库名称、表... 目录关键要点什么是information_schema?主要功能使用示例mysql 中informa

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

MySQL中处理数据的并发一致性的实现示例

《MySQL中处理数据的并发一致性的实现示例》在MySQL中处理数据的并发一致性是确保多个用户或应用程序同时访问和修改数据库时,不会导致数据冲突、数据丢失或数据不一致,MySQL通过事务和锁机制来管理... 目录一、事务(Transactions)1. 事务控制语句二、锁(Locks)1. 锁类型2. 锁粒

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、