🔍 MySQL B+树查询页面IO 动态可视化

动画速度: 1x
准备开始
📋 执行日志
📖 知识说明
👆 输入主键值,点击"开始动画"查看 B+ 树查询全过程

📄 InnoDB 页面(Page)结构

页面是 InnoDB 存储数据的最小单位,默认大小 16KB(16384 字节)

📋 Page Header(页面头部) 38 字节
包含:页号、上下页指针、页类型、LSN 等元数据
∞ 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/页)

💿 磁盘 (.ibd 文件)

🧠 Buffer Pool (内存)

🔄 页面加载过程(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