登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
【面试题】MySQL 三层 B+ 树能存多少数据? ...
【面试题】MySQL 三层 B+ 树能存多少数据?
[ 复制链接 ]
乳杂丫
前天 20:30
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这是一个经典的面试题,但实际估算需要考虑多个变量。下面我将详细拆解计算过程:
核心计算模型
MySQL B+树存储量 = 根节点扇出 × 中间节点扇出 × 叶子节点容量
关键假设(以InnoDB默认配置为例)
页大小
:16KB(16384字节)
主键类型
:BIGINT(8字节)
指针大小
:6字节(InnoDB页指针)
行数据大小
:1KB(1024字节) -
这是关键变量
页空间利用率
:约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万行
场景分析表
行大小每页行数三层B+树容量四层B+树容量200B(小记录)~57行约3800万行约310亿行1KB(典型记录)~10行约670万行约55亿行2KB(较大记录)~5行约335万行约27亿行8KB(大记录)~1行约67万行约5.5亿行
重要说明
实际容量可能更大
:
若使用INT主键(4字节),fan_out ≈ 1365,容量提升近3倍
若行记录更紧凑,每页存储行数更多
B+树层数增长
:
当数据量超过三层容量时,B+树变为四层
四层B+树容量 = fan_out³ × 每页行数
对于1KB行,四层B+树可存储约
55亿行
聚簇索引 vs 二级索引
:
上述计算针对
聚簇索引
(叶子节点存完整数据)
二级索引叶子节点存储主键值,容量会更大
结论
在典型的配置下(BIGINT主键、1KB行数据):
三层B+树大约能存储600万~1000万行数据
四层B+树可存储数十亿行数据
这也是为什么我们常说:
单表千万级别数据时,查询性能仍能保持良好(三层B+树)
数据量过亿时,可能需要考虑分库分表或优化索引设计
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
试题
MySQL
三层
树能
多少
相关帖子
MySQL 5.7.*版本修改字符集(Win11环境)
MySQL客户端连接MySQL8.x出现"错误码2058"(Windows环境)
对线面试官系列:MySQL 常见面试题,你能答对几道?
字符编码知多少(一)
对线面试官系列:MySQL 事务隔离级别
对线面试官系列:搞懂MySQL 回表机制,看这一篇就够了!
MySQL 5.7.x版本修改字符集(Win11环境)
【面试题】为什么 MySQL 选择使用 B+ 树作为索引结构?
【面试题】RabbitMQ 中无法路由的消息会去到哪里?
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
MySQL 5.7.*版本修改字符集(Win11环境)
0
350
祺簇
2025-12-29
安全
MySQL客户端连接MySQL8.x出现"错误码2058"(Windows环境)
1
753
站竣凰
2025-12-30
业界
对线面试官系列:MySQL 常见面试题,你能答对几道?
0
983
吟氅
2025-12-30
业界
字符编码知多少(一)
0
758
欧阳雪枫
2025-12-31
业界
对线面试官系列:MySQL 事务隔离级别
3
493
孜稞
2026-01-01
业界
对线面试官系列:搞懂MySQL 回表机制,看这一篇就够了!
1
1017
尹心菱
2026-01-02
安全
MySQL 5.7.x版本修改字符集(Win11环境)
0
43
苗嘉惠
2026-01-05
业界
【面试题】为什么 MySQL 选择使用 B+ 树作为索引结构?
0
117
赐度虻
2026-01-06
业界
【面试题】RabbitMQ 中无法路由的消息会去到哪里?
0
588
东郭欣然
2026-01-06
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
乳杂丫
前天 20:30
关注
0
粉丝关注
14
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994891
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9994
6
宋子
9978
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9946
查看更多
今日好文热榜
433
公众号`boyogala`的使用指南
948
缓存行
203
基于.NET操作Excel COM组件生成数据透视报
16
【节点】[NormalStrength节点]原理解析与实
303
Windows11系统下VMware Workstation 16安装
173
剑指offer-60、将⼆叉树打印成多⾏
352
FastAPI + TinyDB并发陷阱与实战:告别数据
215
PHP 异步与多线程 从 TrueAsync 展望未来
975
Claude Code 完全指南:使用方式、技巧与最
882
嵌入式 - shell 常用语法简单总结
640
嵌入式 - shell 常用语法简单总结
614
CodeSpirit-考试预生成方案(开源)
853
2026届毕业生春招信息渠道全指南:精准获岗
3
采用自动化与智能体数据管道技术
948
解决java客户端连接ssh失败问题
186
写论文时可用的GPT辅助指令
527
Python微信群发消息
879
AUC 的两种等价定义:从排序概率到 ROC 曲
434
鲁棒与自适应的垂尾抖振控制-EXP-振动控制-
979
性能提升4倍!使用Granian作为Django项目的