MySQL 三层 B+ 树存储容量分析
要计算 MySQL 中三层 B+ 树能存储多少数据,我们需要考虑以下几个关键因素:
1. B+ 树结构特点
- 非叶子节点:只存储键值和指针(不存储实际数据)
- 叶子节点:存储完整数据记录(InnoDB聚簇索引)或主键+指针(二级索引)
- 节点大小:默认16KB(InnoDB页大小)
2. 关键假设参数
- 页大小:16KB (16384字节)
- 主键类型:假设使用 BIGINT(8字节)
- 指针大小:6字节(InnoDB中的页指针)
- 非叶子节点:每个条目约14字节(8+6)
- 叶子节点:
- 聚簇索引:假设每条记录约1KB
- 二级索引:假设键值+指针约20字节
3. 三层B+树容量计算
情况1:聚簇索引(存储实际数据)
- 根节点:
- 可存储条目数:16KB / 14B ≈ 1170个
- 第二层:
- 节点数:1170个
- 总条目数:1170 × 1170 ≈ 1,368,900个
- 第三层(叶子层):
- 每页记录数:16KB / 1KB ≈ 16条
- 总记录数:1,368,900 × 16 ≈ 21,902,400条
情况2:二级索引(仅存储键值+指针)
- 根节点:
- 可存储条目数:16KB / 14B ≈ 1170个
- 第二层:
- 节点数:1170个
- 总条目数:1170 × 1170 ≈ 1,368,900个
- 第三层(叶子层):
- 每页条目数:16KB / 20B ≈ 819条
- 总条目数:1,368,900 × 819 ≈ 1,120,000,000条
4. 影响因素
实际存储量会受以下因素影响:
- 主键大小:使用INT(4字节)比BIGINT(8字节)能存储更多数据
- 行记录大小:行记录越小,叶子层能存储越多
- 填充因子:页不一定完全填满(通常约15KB/页)
- 索引类型:联合索引比单列索引占用更多空间
- 可变长度字段:VARCHAR/TEXT等字段影响实际存储量
5. 实际经验值
- 三层B+树通常可存储:
- 聚簇索引:约2000万条记录(假设1KB/行)
- 二级索引:约10亿条记录
- 四层B+树可存储:
- 聚簇索引:约200亿条记录
- 二级索引:约1万亿条记录
6. 验证方法
可以通过以下命令查看索引层级:
-- InnoDB索引统计信息
ANALYZE TABLE your_table;
SHOW INDEX FROM your_table;
三层B+树的设计使得MySQL在千万级数据量下仍能保持高效查询(通常3次I/O即可找到数据)。
THE END