news 2026/4/21 6:49:47

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/4/8 17:32:00

Claude Code:进入dash模式

Claude Code在命令行界面&#xff0c;可以通过输入&#xff01; dash cmd完成dash命令的操作&#xff0c;比如&#xff1a; 可以看到&#xff0c;可以通过dash模式执行dash命令

作者头像 李华
网站建设 2026/4/21 17:56:03

AI法律咨询系统:用技术打破法律服务壁垒

提到法律咨询&#xff0c;不少人会联想到高昂费用、复杂流程和地域限制。而AI法律咨询系统的出现&#xff0c;正通过技术革新重构法律服务生态&#xff0c;让专业法律支持触手可及。它并非简单的“法条检索工具”&#xff0c;而是融合多重技术的智能服务体&#xff0c;核心价值…

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

简单明了3种如何将Python彻底卸载干净

✅ 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【[点击这里]】&#xff01; 通常我们在一些软件的使用上有碰壁&#xff0c;第一反应就是卸载重装。所以有小伙伴就问我Python怎么卸载才能彻底卸载干净&#xff0c;今天这篇文章&#xff0c;小编就来教大家如何…

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

[嵌入式系统-170]:电机不精确理解与纠正:“直流电机是通过电平信号控制电机的连续运转,步进电机通过电平信号开环控制电机一次旋转固定的角度。伺服电机通过电平信号闭环反馈控制电机一次旋转固定的角度。”

✅ 一、逐句分析与修正 1. “直流电机是通过电平信号控制电机的连续运转” &#x1f50d; 问题&#xff1a; “电平信号”表述模糊&#xff0c;容易误解为简单的高低电平即可调速。直流电机虽然可以持续运转&#xff0c;但其转速和方向需通过PWM或电压调节控制&#xff0c;不…

作者头像 李华
网站建设 2026/4/16 17:07:21

硅胶按键的定制

一、硅胶按键阻值测试1、前言这只硅胶按键是从一个游戏摇柄上拆卸下来的。室温下&#xff0c;硅胶按键中的电阻大约 100Ω 左右。但会随着压力不同而改变。这里使用两个大头针接触硅胶按键&#xff0c;对应的电阻大约 120Ω。下面准备通过制冷半导体改变他的温度&#xff0c;定…

作者头像 李华
网站建设 2026/4/21 14:20:32

个人申报学分管理(11849)

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

作者头像 李华