【面试题】MySQL 三层 B+ 树能存多少数据?

这是一个经典的面试题,但实际估算需要考虑多个变量。下面我将详细拆解计算过程:

核心计算模型

MySQL B+树存储量 = 根节点扇出 × 中间节点扇出 × 叶子节点容量

关键假设(以InnoDB默认配置为例)

  1. 页大小:16KB(16384字节)

  2. 主键类型:BIGINT(8字节)

  3. 指针大小:6字节(InnoDB页指针)

  4. 行数据大小 :1KB(1024字节) - 这是关键变量

  5. 页空间利用率:约70%(需扣除页头、页尾等元数据)

三层B+树结构

复制代码
第1层:根节点(1个)
第2层:中间节点(fan_out个)
第3层:叶子节点(fan_out²个) ← 存储实际数据

详细计算步骤

1. 计算单个非叶子节点能存储的键值对数量(fan_out)

每个索引项大小 = 主键(8B) + 指针(6B) = 14B可用空间 = 16KB × 70% = 11.2KB ≈ 11468字节单个节点索引项数 = 11468 / 14 ≈ 819

即:每个非叶子节点可指向约819个子节点

2. 计算单个叶子节点能存储的数据行数

可用空间 = 16KB × 70% = 11.2KB假设每行数据1KB → 每页约存储 11行 假设每行数据200字节 → 每页约存储 57行 假设每行数据800字节 → 每页约存储 14行

3. 三层B+树总容量计算

公式:总行数 = fan_out² × 每页行数

  • 若每页11行:819² × 11 ≈ 730万行

  • 若每页57行:819² × 57 ≈ 3800万行

  • 若每页14行:819² × 14 ≈ 940万行

更精确的估算(考虑真实InnoDB结构)

实际InnoDB叶子节点存储的是完整数据行,需要考虑:

  • 行格式开销(行头约23字节)

  • 事务系统开销(MVCC的隐藏列:DB_TRX_ID 6B + DB_ROLL_PTR 7B)

  • 可能的NULL位图、变长字段列表等

保守估算:假设主键为BIGINT,每行额外开销约50字节:

  • 行大小 = 数据(1024B) + 行开销(50B) = 1074B

  • 每页行数 = (16384×70%) / 1074 ≈ 10行

  • 总行数 = 819² × 10 ≈ 670万行

场景分析表

重要说明

1.实际容量可能更大

  • 若使用INT主键(4字节),fan_out ≈ 1365,容量提升近3倍

  • 若行记录更紧凑,每页存储行数更多

2.B+树层数增长

  • 当数据量超过三层容量时,B+树变为四层

  • 四层B+树容量 = fan_out³ × 每页行数

  • 对于1KB行,四层B+树可存储约 55亿行

3.聚簇索引 vs 二级索引

  • 上述计算针对聚簇索引(叶子节点存完整数据)

  • 二级索引叶子节点存储主键值,容量会更大

结论

在典型的配置下(BIGINT主键、1KB行数据):

  • 三层B+树大约能存储600万~1000万行数据

  • 四层B+树可存储数十亿行数据

这也是为什么我们常说:

  • 单表千万级别数据时,查询性能仍能保持良好(三层B+树)

  • 数据量过亿时,可能需要考虑分库分表或优化索引设计

文章转载自: ++佛祖让我来巡山++

原文链接: https://www.cnblogs.com/sun-10387834/p/19388703

体验地址: http://www.jnpfsoft.com/?from=001YH

相关推荐
callJJ3 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
S1998_1997111609•X3 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
wbs_scy4 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
KmSH8umpK4 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
jinanwuhuaguo5 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
BU摆烂会噶5 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain
xmjd msup6 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
l1t6 小时前
DeepSeek总结的DuckLake 入门
数据库
952366 小时前
SpringBoot统一功能处理
java·spring boot·后端
Joseph Cooper6 小时前
RAG 与 AI Agent:智能体真的需要检索增强生成吗?
数据库·人工智能·ai·agent·rag·上下文工程