mysql deallocate 深度解析MySQL InnoDB 数据页
mysql deallocate 深度解析MySQL InnoDB 数据页
本文基于 MySQL 8.0 版本,从数据页的本质、核心结构、工作机制、与 B+ 树的关联、实战优化五个维度mysql deallocate 深度解析MySQL InnoDB 数据页,详细介绍 数据页——这是理解 存储引擎、索引原理、性能优化的最底层核心。

一、数据页的本质1.1 数据页是 存储的最小物理单位
管理数据的核心逻辑是:不以“行”为单位存储数据,而是以“页(Page)”为最小物理存储单位。
1.2 数据页的类型
有多种页类型,不同类型对应不同功能,其中数据页(也叫 B+ 树节点页,类型编号 ) 是最关键的类型:
页类型
作用
数据页(B+ 树节点页)
存储行数据(B+ 树叶子节点)或索引数据(非叶子节点)
undo 日志页
存储事务回滚日志
索引页
存储非叶子节点的索引键+页指针(本质是特殊数据页)
系统页
存储表空间、段、区的元数据
本文主要介绍“数据页(B+ 树节点页)”—— 它是 存储行数据和索引的容器,也是 B+ 树的基本组成单元。
1.3 数据页的核心作用数据存储:所有行数据最终都存储在数据页中,一页可存储多条行记录(取决于行大小,16KB 页通常可存几百行);索引载体:B+ 树的每个节点(叶子/非叶子)都是一个数据页,叶子节点页存行数据,非叶子节点页存索引键+页指针;磁盘 IO 单位: 与磁盘交互的最小单位是页,优化页的使用效率=优化磁盘 IO=提升 MySQL 性能。二、 数据页的核心结构
数据页的结构是固定格式+可变内容,总大小默认 16KB,核心分为 7 个部分,按顺序排列如下(从页头到页尾):
┌─────────────────────────────────────────────────────────────────────┐
│ 1. 文件头(File Header)| 38 字节 | 页的基础元数据 │
├─────────────────────────────────────────────────────────────────────┤
│ 2. 页头(Page Header)| 56 字节 | 数据页的核心控制信息 │
├─────────────────────────────────────────────────────────────────────┤
│ 3. Infimum/Supermum 记录 | 26 字节 | 页内记录的边界标记 │
├─────────────────────────────────────────────────────────────────────┤
│ 4. 用户记录(User Records)| 可变 | 实际存储的行数据(核心) │
├─────────────────────────────────────────────────────────────────────┤
│ 5. 空闲空间(Free Space)| 可变 | 页内未使用的空间 │
├─────────────────────────────────────────────────────────────────────┤
│ 6. 页目录(Page Directory)| 可变 | 快速查找页内记录的「目录」 │
├─────────────────────────────────────────────────────────────────────┤
│ 7. 文件尾(File Trailer)| 8 字节 | 页的完整性校验 │
└─────────────────────────────────────────────────────────────────────┘
下面逐部分拆解,讲清每个部分的存储内容和核心作用:
2.1 1. 文件头(File ):38 字节,页的“身份证”
文件头存储页的全局元数据,用于 识别页的类型、归属、链接关系,核心字段如下(仅列高频核心):
字段名
大小
核心作用
KSUM
4 字节
页的校验和(用于校验页是否损坏)
4 字节
页的偏移量(唯一标识页在表空间中的位置)
2 字节

页类型(数据页=,索引页=同数据页)
4 字节
上一个页的偏移量(双向链表的前驱指针)
4 字节
下一个页的偏移量(双向链表的后继指针)
8 字节
页的最后修改 LSN(崩溃恢复时用)
关键作用:2.2 2. 页头(Page ):56 字节,数据页的控制中心
页头存储当前数据页的核心运行状态,核心字段如下:
字段名
大小
核心作用
2 字节
页目录中的槽(slot)数量
2 字节
页内的用户记录数量
2 字节
空闲空间的起始偏移量
2 字节
页内标记为删除的记录大小(可复用空间)
2 字节
最后插入记录的位置偏移量
2 字节
记录插入方向(正序/倒序,优化插入性能)
关键作用:2.3 3. / 记录:26 字节,页内记录的“边界哨兵”

这是 自动插入的两条虚拟记录,不是用户数据,用于标记页内记录的边界:
关键作用:2.4 4. 用户记录(User ):可变大小,数据页的核心内容
这是数据页中真正存储用户行数据的区域,也是占用空间最大的部分。
核心特性:行格式存储:用户记录按 的行格式(Row )存储mysql deallocate,支持 、、、 四种(默认 );行格式决定了行数据的存储方式(如 NULL 值是否存储、变长字段的溢出处理);例如 格式会将变长字段(/TEXT)的前 768 字节存在页内,超出部分存到溢出页。记录头信息+行数据:每条用户记录由“记录头信息(5 字节)+ 实际列数据”组成:记录头信息:存储记录的状态(是否删除)、下一条记录的偏移量(单链表指针)、记录类型等;实际列数据:存储用户定义的列值(如 id、name、age 等)。紧凑存储: 会尽可能紧凑存储记录,减少页内空间浪费(如 NULL 值不占空间、数值类型按最小字节存储)。2.5 5. 空闲空间(Free Space):可变大小,页的备用空间
页内未被使用的连续空间,新记录会优先插入到这里。
2.6 6. 页目录(Page ):可变大小mysql deallocate,页内记录的索引
页目录是数据页的内部小索引,用于快速定位页内的记录,避免全页遍历。
核心工作原理:槽(Slot)机制:页目录由多个槽组成,每个槽存储某条记录的偏移量(指向页内的具体记录);分组存储: 会将页内的用户记录按主键/索引键排序后分组,每个组对应一个槽,槽中存储该组最后一条记录的偏移量;二分查找:查找页内记录时,先对页目录的槽进行二分查找mysql deallocate 深度解析MySQL InnoDB 数据页,定位到目标记录所在的组,再遍历该组的记录,大幅减少查找次数。实例:
假设页内有 100 条记录,分成 10 个槽(每个槽对应 10 条记录):
2.7 7. 文件尾(File ):8 字节,页的完整性校验
文件尾只有一个核心作用:校验页是否完整、未损坏。
校验逻辑:
读取/写入页时,会对比文件头和文件尾的校验和、LSN:
三、数据页的核心工作机制3.1 数据页与 B+ 树的关联
的 B+ 树索引本质是数据页的集合,不同层级的页分工明确:
【B+ 树非叶子节点(索引页)】
每个页存储:索引键值 + 子页的偏移量(指向子数据页)
页A(索引键:100, 200;子页指针:页B、页C、页D)
/ |
【B+ 树叶子节点(数据页)】
页B(存储 id 1-100 的行数据) → 页C(id 101-200) → 页D(id 201+)
(叶子节点通过 File Header 的 PREV/NEXT 组成双向链表)
关键流程:查询 id=150 的记录从根节点页A开始,找到索引键 150 对应的子页指针(页C);加载页C到内存( Pool);通过页C的页目录,快速定位到 id=150 的记录;返回记录数据。3.2 页分裂(Page Split):影响性能的核心机制什么是页分裂?
当数据页的空闲空间不足,无法插入新记录时, 会将当前页拆分为两个页,将部分记录迁移到新页——这个过程就是页分裂。
页分裂的触发条件:页分裂的影响:
负面影响:
优化方案:
使用自增整数主键:自增主键插入时mysql deallocate,新记录会追加到当前页的末尾,极少触发页分裂;避免无序插入:如避免用 UUID、随机数作为主键;预分配空间:对大批量插入的表,提前扩展表空间,减少运行时的页分裂。3.3 页合并(Page Merge):空间回收机制什么是页合并?
当数据页的记录被大量删除,空间利用率低于阈值(默认 50%), 会将当前页与相邻的页合并,释放空闲空间——这个过程就是页合并。
核心逻辑:删除记录后, 检查当前页的空间利用率;若利用率 < 50%,尝试合并相邻的兄弟页;合并后,原两个页的记录存入一个页,另一个页标记为空闲,供后续使用;更新父索引页的指针,删除指向被释放页的引用。实战意义:
页合并是 自动回收空间的机制,但频繁的合并会增加性能开销,因此:
3.4 数据页与 Pool(内存交互核心)
不会直接读写磁盘上的页,而是通过 Pool(缓冲池)作为中介:
读取页:先检查 Pool 中是否有目标页,有则直接使用(内存速度),无则从磁盘加载到 Pool;修改页:先修改 Pool 中的页(脏页),后台线程异步将脏页刷到磁盘;淘汰策略: Pool 满时,用 LRU 算法淘汰最久未使用的页。实战优化:四、数据页的关键实战问题4.1 为什么 默认页大小是 16KB?
这是平衡磁盘 IO 效率和内存利用率的最优选择:
4.2 行格式对数据页的影响?
不同行格式决定了行数据在页内的存储方式,直接影响页的利用率:
五、总结数据页是 最小存储/IO 单位:默认 16KB,所有数据/索引都存在页中,磁盘 IO 以页为单位;数据页的核心结构:文件头(链接+校验)、页头(状态)、用户记录(核心数据)、页目录(快速查找)、文件尾(完整性);关键机制:页分裂(无序插入导致,性能损耗)、页合并(空间回收)、 Pool 中介(内存交互);优化关键:用自增主键减少页分裂、调大 Pool 缓存更多页、避免全表扫描、优化页碎片。
掌握 数据页,是理解聚簇索引、B+ 树、 Pool的基础,也是优化 MySQL 性能的底层逻辑—— 所有上层的索引优化、SQL 优化,最终都要落到数据页的高效使用上!

1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » mysql deallocate 深度解析MySQL InnoDB 数据页
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

