MySQL 灵魂拷问:你的数据页藏着多少「反常识」?
你是否曾被这些问题困扰?
- 表里只有 100 条记录,查询时 InnoDB 却读了 1000 行数据?
- 删除大量数据后,表文件大小纹丝不动?
- 1KB 的记录,16KB 的数据页为啥只能存 15 条?
这些「反常识」现象的背后,藏着 InnoDB 数据页的精妙设计。今天咱们就像拆盲盒一样,层层剥开这个 16KB 存储单元的秘密,让你彻底搞懂 MySQL 的数据存储逻辑!
一、整体架构:16KB 的「集装箱式」数据仓库
数据页作为 InnoDB 最基本的存储单位,大小固定为 16KB。它内部划分为 7 大功能模块。
数据页结构:七大模块解析。
模块名称 | 中文名 | 占用空间 | 作用解析 |
File Header | 文件头 | 38字节 | 记录页号、前后页指针等元数据,用于页的定位和导航 |
Page Header | 页头 | 56字节 | 记录页内记录数量、空闲空间、第一条记录位置等统计信息 |
Infimum+Supremum | 伪记录 | 固定大小 | 标记页内记录的最小值和最大值,确保记录有序性 |
User Records | 用户记录 | 动态变化 | 实际存储数据的地方,采用链表结构组织记录 |
Free Space | 空闲空间 | 动态变化 | 存储可重用的空间,DELETE后空间不立即释放 |
Page Directory | 页目录 | 动态变化 | 记录分组信息,用于快速定位记录位置 |
File Trailer | 文件尾 | 8字节 | 存储校验和,确保数据完整性 |
看到这里,你可能会问:这么复杂的结构,真的有必要吗?别急,接下来我们就通过几个「颠覆认知」的问题,揭开数据页设计背后的秘密。
二、硬核拆解:3 个颠覆认知的存储秘密
真相一:1KB 记录 ×16KB 页 = 15 条?空间都去哪了?
❓ 疑惑: 16KB 理论上能存 16 条 1KB 记录,但实际只能存 15 条甚至更少。