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层,行数可达数百亿。
实际生产中建议单表控制在 千万级 或配合分区/分表,以维持良好性能。