news 2026/4/18 9:32:44

MySQL页结构的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL页结构的庖丁解牛

MySQL 页结构(InnoDB Page Structure)是 InnoDB 存储引擎管理磁盘与内存数据的最小单位,默认大小为16KB。它不仅是数据存储的物理容器,更是B+ 树索引、事务日志、行记录的组织基础。


一、页的整体布局(16KB = 16384 字节)

▶ 1.页头(Page Header, 38 字节)
  • 作用:描述页的元数据
  • 关键字段
    字段说明
    PAGE_N_DIR_SLOTS页目录槽数量
    PAGE_HEAP_TOP堆顶位置(空闲空间起始)
    PAGE_N_HEAP堆中记录数(含 Infimum/Supremum)
    PAGE_FREE已删除记录链表头
    PAGE_GARBAGE可重用空间字节数
▶ 2.页目录(Page Directory, 可变)
  • 作用:加速页内行记录查找(类似书签)
  • 结构
    • 4–8 条记录生成一个槽(Slot)
    • 槽存储记录的偏移量
  • 查找流程

    二分查找页目录

    定位槽

    线性扫描槽内记录

▶ 3.用户记录(User Records, 可变)
  • 内容
    • Infimum 记录:虚拟最小记录(页内第一条)
    • Supremum 记录:虚拟最大记录(页内最后一条)
    • 实际行数据:按主键顺序存储
▶ 4.空闲空间(Free Space)
  • 位置:用户记录与页尾之间
  • 用途:插入新记录时动态分配
▶ 5.页尾(Page Trailer, 8 字节)
  • 内容
    • 校验和(Checksum):检测页损坏
    • 日志序列号(LSN):用于崩溃恢复

💡核心认知
页 = 元数据 + 目录 + 数据 + 空闲空间 + 校验


二、行记录(Row Record)如何存储?

▶ 1.行格式(Compact vs Dynamic)
字段CompactDynamic
变长字段长度列表存储所有变长字段长度仅存前 768 字节长度
NULL 标记位1 位/可为空列同左
大字段(TEXT/BLOB)全部存页内页内存指针,数据存溢出页
▶ 2.单行结构(Compact)
[变长字段长度列表][NULL 标记位][记录头][列1][列2]...
  • 记录头(Record Header, 5 字节)
    • deleted_flag:是否已删除
    • min_rec_flag:是否为最小记录
    • n_owned:当前记录拥有的记录数(用于页目录)
    • heap_no:堆中序号(Infimum=0, Supremum=1)
    • record_type:记录类型(0=普通, 1=B+树节点指针)
▶ 3.行链接(Next Record)
  • 机制
    • 每条记录末尾存储下一条记录的偏移量
    • 形成单向链表(非物理连续)
  • 目的
    • 支持范围扫描(如WHERE id > 100

三、页的生命周期:分裂与合并

▶ 1.页分裂(Page Split)
  • 触发条件
    • 插入新记录时,空闲空间不足
  • 过程
    1. 创建新页
    2. 将原页50%~90% 记录移至新页(取决于插入位置)
    3. 更新父节点指针
  • 影响
    • 写放大:1 次插入 → 2 次页写入
    • 空间碎片:页利用率可能降至 50%
▶ 2.页合并(Page Merge)
  • 触发条件
    • 删除记录后,页利用率 < 50%
  • 过程
    1. 尝试与相邻页合并
    2. 若合并后 ≤ 16KB,则释放一个页
  • 限制
    • 仅适用于叶子节点
    • 非叶子节点不合并(避免树高度变化)

四、工程优化:页结构如何影响性能?

▶ 1.行大小设计
  • 原则
    • 单行 ≤ 8KB(避免溢出页)
    • 变长字段(VARCHAR/TEXT)慎用
  • 示例
    -- 优化前:TEXT 导致溢出页CREATETABLElogs(contentTEXT);-- 优化后:限制长度CREATETABLElogs(contentVARCHAR(10000));
▶ 2.主键选择
  • 自增主键优势
    • 新记录追加到页末尾 →减少页分裂
  • UUID 主键劣势
    • 随机插入 →频繁页分裂→ 空间利用率 ↓
▶ 3.监控页利用率
-- 查看表空间碎片SELECTtable_name,data_length/16384ASpages_used,(data_length+data_free)/16384ASpages_allocated,ROUND(100*data_length/(data_length+data_free),2)ASpct_usedFROMinformation_schema.tablesWHEREtable_schema='your_db';

五、避坑指南

陷阱破局方案
盲目使用 TEXT限制 VARCHAR 长度,避免溢出页
UUID 作主键改用自增 ID 或有序 UUID(如 UUID_TO_BIN(uuid, true))
忽略页分裂批量导入时先排序主键

六、终极心法

**“页不是容器,
而是数据的细胞——

  • 当你设计行结构
    你在校准密度;
  • 当你选择主键
    你在优化分裂;
  • 当你监控利用率
    你在铸造韧性。

真正的存储能力,
始于对页的敬畏,
成于对细节的精控。”


结语

从今天起:

  1. 单行大小控制在 8KB 内
  2. 主键优先使用自增 ID
  3. 定期监控表空间碎片率

因为最好的数据库设计,
不是盲目建表,
而是精准控制每一比特的存储。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 20:28:27

车辆控制十年演进

车辆控制算法&#xff08;Vehicle Control&#xff09; 的十年&#xff08;2015–2025&#xff09;&#xff0c;是从“单一维度的机械跟随”向“全域协同的具身智能”进化的十年。 控制算法是自动驾驶的“双手”&#xff0c;负责将智驾大脑的决策精准转化为油门、刹车和转向。…

作者头像 李华
网站建设 2026/4/15 19:03:51

多智能体 KYC 系统实战:架构、组件与技术栈全解析

简简单单 Online zuozuo &#xff1a;本心、输入输出、结果 文章目录 多智能体 KYC 系统实战&#xff1a;架构、组件与技术栈全解析前言1、为什么传统 KYC 系统开始“撑不住了”&#xff1f;2、多智能体 KYC 系统的整体架构思路3、多智能体 KYC 带来的三类关键收益4、多智能体 …

作者头像 李华
网站建设 2026/4/17 17:43:12

自动化脚本

很多运维从业者都具备 “自动化脚本编写” 能力&#xff08;如 Shell/Python 批量处理服务器配置、日志分析&#xff09;&#xff0c;但多数人没意识到&#xff0c;这项技能在网安领域是 “稀缺竞争力”—— 网安工作中大量重复操作&#xff08;如漏洞扫描、基线检查、日志分析…

作者头像 李华
网站建设 2026/4/18 8:53:14

深度测评10个AI论文工具,专科生搞定毕业论文!

深度测评10个AI论文工具&#xff0c;专科生搞定毕业论文&#xff01; AI工具如何助力论文写作&#xff1f;专科生也能轻松应对 在当前的学术环境中&#xff0c;越来越多的学生开始借助AI工具来辅助论文写作。尤其是对于专科生而言&#xff0c;面对繁重的毕业论文任务&#xf…

作者头像 李华
网站建设 2026/4/18 5:35:19

C++ 结构体:struct 的定义与结构体数组

C 结构体&#xff08;struct&#xff09;&#xff1a;定义、用法与结构体数组 &#xff08;从零基础到能写出常见场景&#xff0c;带完整示例 对比 常见坑&#xff09; 结构体是 C 中非常重要的用户自定义复合类型&#xff0c;它让你能把不同类型的数据捆绑成一个整体&#…

作者头像 李华
网站建设 2026/4/18 5:39:56

高校毕业生就业管理系统(11846)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华