📄 InnoDB 页面(Page)结构
页面是 InnoDB 存储数据的最小单位,默认大小 16KB(16384 字节)
∞ Infimum + Supremum(边界记录)
26 字节
虚拟的最小和最大记录,作为页内记录的边界
📝 User Records(用户记录区)
变长
实际存储的行数据,按主键顺序线性存放
示例:[id=1, name=Alice] [id=2, name=Bob] ... [id=99, name=Zoe]
每个记录包含:记录头(5B) + 变长字段长度 + NULL标志 + 数据
🟡 Free Space(空闲空间)
变长
尚未使用的空间,插入新记录时从这里分配
📑 Page Directory(页目录)
变长
槽位(Slot)目录,每 4-8 条记录一个槽,用于二分查找加速
🔒 File Trailer(文件尾部)
8 字节
校验位(Checksum),用于检测页面是否损坏
📌 页内记录查找过程
当页面加载到内存后,查找一条记录的过程:
- 第1步:通过 Page Directory 二分查找,定位到记录可能所在的槽位
- 第2步:在槽位指定的范围内,线性扫描找到目标记录
- 第3步:返回记录数据
💾 磁盘与内存(Buffer Pool)交互过程
页面是磁盘与内存之间交换数据的基本单位(16KB/页)
🔄 页面加载过程(Page Fault → Buffer Pool)
- 1. 查询需要页面 P → 检查 Buffer Pool
- 2. 页面不在内存(Miss) → 触发页面 IO
- 3. 检查 Buffer Pool 是否有空闲空间:
- 有空闲 → 直接加载
- 无空闲 → 从 LRU 尾部淘汰页面(如果是脏页,先刷盘)
- 4. 从磁盘读取页面 P:offset = page_no × 16KB
- 5. 页面 P 加载到 Buffer Pool → 后续访问零 IO