B+ Tree 与 LSM Tree 对比
选 MySQL 还是 HBase?用 RocksDB 还是 InnoDB?这个问题没有标准答案,但有一个系统的思考框架。
B+ Tree 和 LSM Tree 是两种最主流的存储结构,它们的设计哲学截然不同。
核心差异
这个根本差异,导致了读写性能、空间效率、写入性能的全方位权衡。
写入性能对比
B+ Tree 写入
一次写入可能需要:
- 读取目标页(如果不在缓存)
- 写入数据
- 更新各级索引
- 刷盘
LSM Tree 写入
LSM Tree 的写入成本:
- 写入 WAL(顺序写)
- 写入 MemTable(内存操作)
- 异步刷盘(批量顺序写)
写入性能实测
读取性能对比
B+ Tree 读取
单次查找,最多访问 log_m(n) 个节点(通常 3~4 层)。
LSM Tree 读取
可能需要检查多层:
最坏情况需要读取所有层。
读取性能实测
空间放大 vs 读写放大
概念定义
空间放大(Space Amplification):实际占用的磁盘空间 / 有效数据大小
写放大(Write Amplification):磁盘实际写入量 / 应用写入量
读放大(Read Amplification):磁盘读取次数 / 应用读取次数
对比总结
选型建议
选择 B+ Tree
- 读多写少:OLTP 业务,大量点查和范围查询
- 强一致性要求:需要原地更新
- 复杂事务:跨多表的复杂查询和更新
- 团队熟悉度:团队更熟悉 MySQL/PostgreSQL
选择 LSM Tree
- 写多读少:日志、监控、时序数据
- 高写入吞吐:消息队列、CDC
- 大存储容量:TB~PB 级数据
- 资源受限:希望用更少资源支撑更高写入
场景化选型
混合方案
实际系统往往不是非此即彼,而是结合两者优势:
MySQL + InnoDB + RocksDB:
内存 B+ Tree + 磁盘 LSM Tree:
核心结论:没有最好的存储结构,只有最适合场景的选择。理解 B+ Tree 和 LSM Tree 的权衡,是做出正确决策的基础。