












MySQL 中 3 层的 B + 树结构最多能存储多少条数据,这个问题需要结合 B + 树的结构特点和页大小来计算。
MySQL 的 InnoDB 存储引擎中,B + 树的每个节点对应一个数据页(默认大小 16KB=16384 字节),我们需要先确定:
BIGINT主键(8 字节)为例(如果是 INT 则 4 字节,可替换计算)。非叶子节点的每个条目 = 索引键(8 字节) + 子节点指针(6 字节) = 14 字节。
一个 16KB 的页,扣除页头 / 页尾的固定开销(约 100 字节),可用空间约 16284 字节。
单页可存储的条目数 = 16284 ÷ 14 ≈ 1163(向下取整,保证不超页大小)。
即:每个非叶子节点最多指向 1163 个子节点(扇出数 = 1163)。
3 层 B + 树的结构是:「根节点(第 1 层)」→「中间节点(第 2 层)」→「叶子节点(第 3 层)」。
叶子节点存储整行数据(主键索引),假设每行数据大小为 1KB(实际可根据业务调整,比如 512 字节、2KB):
单叶子页可存行数 = 16KB ÷ 1KB = 16 行(若行更小,比如 512 字节,则单页存 32 行)。
总数据行数 = 叶子节点数 × 单叶子页行数
= 1163×1163 × 16
≈ 1163² ×16 = 1352569 ×16 ≈ 21641104 行(约 2164 万行)。
如果调整参数,结果会变化,举 2 个常见例子:
| 调整条件 | 扇出数 | 叶子单页行数 | 3 层 B + 树总行数 |
|---|---|---|---|
| 主键为 INT(4 字节) | ~1809 | 16 | ≈1809²×16≈5227 万 |
| 行大小为 512 字节 | 1163 | 32 | ≈4328 万 |
| 页大小改为 32KB | ~2327 | 32 | ≈2327²×32≈17298 万 |
-------------------------
这个 100 字节的固定开销,是InnoDB 数据页结构中 “页头 + 页尾” 的通用估算值,并非精确值,本质是对页元数据占用空间的简化描述。
InnoDB 的 16KB 数据页,整体分为 7 个部分,其中页头(File Header)、页尾(File Trailer) 是所有类型数据页(不管是叶子节点还是非叶子节点)都必须有的固定结构,再加上少量其他固定元数据,共同构成了这约 100 字节的开销。
| 数据页结构 | 大小(字节) | 作用 |
|---|---|---|
| File Header(页头) | 38 | 存储页的通用信息:页类型(叶子 / 非叶子)、上一页 / 下一页指针、页编号、创建时间等 |
| Page Header | 56(非叶子节点)/ 12(叶子节点) | 存储当前页的特有信息:如非叶子节点的指针数量、叶子节点的记录数等 |
| Infimum/Supermum | 26 | 页内的最小 / 最大虚拟记录,用于界定记录范围,是固定存在的 |
| User Records | 可变 | 实际存储的用户数据(叶子节点)或索引 + 指针(非叶子节点) |
| Free Space | 可变 | 页内的空闲空间 |
| Page Directory | 可变 | 页内记录的目录项,加速记录查找 |
| File Trailer(页尾) | 8 | 存储页的校验和、事务 ID 等,用于校验页的完整性(防止数据损坏) |
我们以非叶子节点(计算扇出数时用的就是非叶子节点)为例,把固定必有的元数据加起来:
把这些核心固定元数据相加,大概在 90-120 字节 之间,为了计算方便,就统一估算为 100 字节。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。