日期: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。
面试官追问
- 为什么内部节点扇出很高?
- 自增主键如何影响页利用率?
- 二级索引的三层容量如何估算?
高分补充
这个问题考查估算能力:先声明假设,再给数量级,最后说明缓存和数据分布带来的偏差。
学习清单
- 记住容量公式,并能替换不同平均行宽重新计算。