mysql系列之B+树,测算存放多少数据

3 阅读2分钟

B+树的特点

  • 数据全在叶子节点:内部节点只存键值,用于路由,所有实际数据(或主键)都位于叶子节点。
  • 叶子节点链表:同级叶子节点通过双向链表连接,支持高效范围扫描。
  • 多路平衡:每个节点可以有多个子节点(高扇出),树的高度很低。
  • 查询稳定:所有查询都需走到叶子节点,I/O次数等于树高。
  • 磁盘友好:节点大小通常与磁盘页对齐(如16KB),减少I/O。

图形示意(文本版,m=3示意)

text

                 [ 50 ]
                /     \
        [ 20, 30 ]     [ 70, 80 ]
        /    |    \     /    |    \
   [10]  [25]  [40]  [60]  [75]  [90]   ← 叶子节点(存数据/主键)
     │     │     │     │     │     │
     └─────┴─────┴─────┴─────┴─────┘
                双向链表
  • 内部节点(如 [50])只存键;叶子节点存储数据行(聚集索引)或主键值(二级索引)。

MySQL InnoDB中B+树一般有几层?

  • 2~4层,绝大多数表为 3层
    3层B+树足以支撑数千万行数据,因为每个节点扇出很大(约1000+),总行数 ≈ 根节点扇出 × 内部节点扇出 × 叶子节点行数,轻松过千万。

每个叶子节点能存多少数据?

  • 默认页面大小 16KB,叶子节点实际可用空间约 15KB(含页头、槽等开销)。

  • 存储行数 = 15KB ÷ 平均行大小。

    • 行约 1KB → 约 15行
    • 行约 100字节 → 约 150行
    • 行很大(如含长文本)→ 可能仅几行,甚至溢出到外部页。

一张表最多有多少条数据?

  • 理论上无硬性上限,受限于文件系统、磁盘空间和B+树层数。

  • InnoDB表空间最大可达 64TB(单表文件),行数可达 数百亿 甚至更多。

  • 以3层B+树估算(常用):

    • 假设每个叶子节点存 15行,每个内部节点存约 1200个键(16KB页,每个键约13字节)
    • 则 根节点扇出1200 × 内部节点扇出1200 × 15 ≈ 2160万行
    • 若行更小,行数可指数级增加;若B+树为4层,行数可达数百亿。

实际生产中建议单表控制在 千万级 或配合分区/分表,以维持良好性能。