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

MySQL 三层 B+ 树存储容量分析

要计算 MySQL 中三层 B+ 树能存储多少数据,我们需要考虑以下几个关键因素:

1. B+ 树结构特点

  • 非叶子节点:只存储键值和指针(不存储实际数据)
  • 叶子节点:存储完整数据记录(InnoDB聚簇索引)或主键+指针(二级索引)
  • 节点大小:默认16KB(InnoDB页大小)

2. 关键假设参数

  1. 页大小:16KB (16384字节)
  2. 主键类型:假设使用 BIGINT(8字节)
  3. 指针大小:6字节(InnoDB中的页指针)
  4. 非叶子节点:每个条目约14字节(8+6)
  5. 叶子节点
    • 聚簇索引:假设每条记录约1KB
    • 二级索引:假设键值+指针约20字节

3. 三层B+树容量计算

情况1:聚簇索引(存储实际数据)

  1. 根节点
    • 可存储条目数:16KB / 14B ≈ 1170个
  2. 第二层
    • 节点数:1170个
    • 总条目数:1170 × 1170 ≈ 1,368,900个
  3. 第三层(叶子层)
    • 每页记录数:16KB / 1KB ≈ 16条
    • 总记录数:1,368,900 × 16 ≈ 21,902,400条

情况2:二级索引(仅存储键值+指针)

  1. 根节点
    • 可存储条目数:16KB / 14B ≈ 1170个
  2. 第二层
    • 节点数:1170个
    • 总条目数:1170 × 1170 ≈ 1,368,900个
  3. 第三层(叶子层)
    • 每页条目数: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
喜欢就支持一下吧
点赞15 分享