2025年Java面试宝典(点击蓝色链接直接保存)这份资料整理了高频B树面试题解,包含MySQL索引实现原理,建议配合本文阅读
为什么大厂面试官总爱问B树存储量?
前阵子帮学弟模拟面试,他卡在了"B树能存多少数据"这道题。后来我发现,这个问题不仅能考察候选人对B树结构的理解,还能验证其对数据库索引底层原理的实战认知。咱们以MySQL的InnoDB引擎为例,它的索引正是采用B+树结构。

B树的高度如何决定存储量?
先明确两个关键参数:阶数m和树高h。阶数决定每个节点最多存放多少子节点指针,树高则代表数据分布的层级。存储总量= (m^(h) - 1) * 单节点容量
但实际工程中要考虑页大小。比如MySQL默认页16KB,假设主键用bigint(8字节),页指针6字节,那么单页最多存放的键值对数量为:
16KB / (8+6) ≈ 1170条
当树高为3时:
根节点1页 → 第二层1170页 → 第三层1170×1170≈137万页
按每页16KB计算,总数据量≈137万×16KB=21GB
这里要注意叶子节点是否存储数据。在B+树中只有叶子节点存数据,非叶子节点仅存索引键和指针,这种结构能比普通B树存储更多数据
这些因素会让存储量腰斩!
- 键值长度:用UUID做主键比用自增ID少存40%数据
- 填充因子:MySQL默认页填充率约15/16,保留空间用于更新
- 碎片率:删除操作产生的空间碎片可达10%-20%
- 行格式:COMPACT格式比REDUNDANT节省20%空间
举个例子:同样存1亿条用户数据
用int主键(4字节)的B+树高度为3
用varchar(32)做主键时树高可能涨到4层,查询效率下降30%
真实场景下的存储计算
假设现在要设计用户表:
- 主键ID:bigint(8字节)
- 用户状态字段:20字节
- 创建时间:timestamp(4字节)
- 索引页指针:6字节
- 页头信息:约128字节
每个索引页可用空间:16KB - 128B = 16240B
单页键值容量:16240 / (8+6) ≈ 1160条
当树高为3时总记录数≈1160×1160×1160≈15.6亿条
但实际要预留15%的页空间,最终存储量约为13亿条。这与我们压测阿里云RDS时得到的数据基本吻合

高频面试追击:B树存储应用题
-
MySQL某表3层B+树突然变成4层,可能是什么原因?
(数据暴涨导致树分裂/主键类型变更导致键值增大) -
为什么推荐用自增主键?
(减少页分裂,保持B+树右侧顺序增长) -
2000万数据查询变慢怎么排查?
(检查B+树高度是否增加/索引是否失效)
如果大家正在准备技术面试,可以通过面试鸭返利网购买会员,使用我的专属返利码能立减25元。他们整理了近三年大厂真题库,包含大量B树相关的场景题解析。
优化B树存储的三大狠招
- 冷热分离:将历史数据归档到单独表空间
- 前缀压缩:对长字符串索引使用
COLUMN_KEY压缩 - 页大小调优:SSD硬盘可尝试32KB页提升吞吐
某电商平台通过调整页大小+自增主键,将订单表的B+树高度从4降回3,QPS提升了18倍。这背后的原理就是减少了磁盘IO次数。

遇到存储瓶颈怎么办?
当B树高度不可控增长时,建议:
- 垂直分表:拆分大字段到扩展表
- 水平分片:按时间或hash分表
- 改用LSM树:像ClickHouse那样顺序写
最近在面试鸭返利网看到有同学分享,通过分库分表把十亿级用户表的B+树高度控制在3层内,查询耗时从800ms降到50ms以内。这种实战经验正是大厂看重的。


