Yihui’s Blog

MySQL 三层 B+ 树能存多少数据?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #B+树 #InnoDB #容量估算 #VIP

一句话答案

没有固定答案;容量取决于页大小、索引键和指针宽度、行宽及页利用率。按 16KB 页、内部节点扇出约 1000、每个叶子页约 16 条 1KB 记录估算,三层聚簇索引约可容纳 1600 万行。

面试口语版

三层通常指根节点、内部节点、叶子节点。InnoDB 默认页 16KB,内部节点只放 key 和子页指针,扣除页头、槽目录和记录开销后,BIGINT 主键场景扇出粗略可按一千估。根节点指向约一千个内部页,每个内部页再指向约一千个叶子页,大约一百万叶子页。如果聚簇索引一行约 1KB,每页约 16 行,总量约 1600 万行;如果每行只有 100B,可达到上亿行。面试中重点应说清假设和公式,而不是死背“两千万”。

原理拆解

容量 ≈ 根扇出 × 中间层扇出 × 每个叶子页记录数
     ≈ 1000 × 1000 × 16
     ≈ 16,000,000 行

关键细节

  • 聚簇索引叶子存整行,行越宽,每页记录越少;二级索引叶子存索引键和主键,容量模型不同。
  • 变长字段页外存储、页分裂、填充率和记录头都会影响结果。
  • 树高不等于每次一定做三次物理 IO,根和上层节点通常长期在 Buffer Pool。

面试官追问

  1. 为什么内部节点扇出很高?
  2. 自增主键如何影响页利用率?
  3. 二级索引的三层容量如何估算?

高分补充

这个问题考查估算能力:先声明假设,再给数量级,最后说明缓存和数据分布带来的偏差。

学习清单

  • 记住容量公式,并能替换不同平均行宽重新计算。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts