LSM-treeLog-structured merge

将写入积累后批量生成有序文件,后台逐步合并。

核心约束
多个有序层共同表示逻辑数据,读需解析版本与删除标记。
适用问题
写入密集的持久化键值存储。
边界与取舍
Compaction 会消耗 I/O;快照与版本保留增加成本。
2 · 5 · 91 · 4 · 81 · 2 · 4 · 5 · 8 · 9
有序归并示意:输入已排序;归并排序还需从原始输入建立有序段,可递归划分或自底向上合并。

常见操作#

L 为磁盘层数,r 为实际访问的 sorted runs 数,k 为输出记录数;参数依压实策略变化。

操作时间复杂度条件与说明
写入WAL 追加 + MemTable 更新以启用 WAL 的持久化路径为例,配置可关闭 WAL;内存结构、刷盘和后续 compaction 工作也须计入。
点查找过滤器检查 + 候选文件索引 / 数据块读取层数、L0 文件重叠、Bloom 误判和缓存命中共同决定读放大。
范围扫描定位各路起点 + 多路有序归并访问 r 路候选时,每个输出可有 O(log⁡r)O(\log r) 堆维护;墓碑和旧版本可能带来额外扫描。
删除写入墓碑,稍后压实回收逻辑删除并不立即释放全部磁盘空间。
压实读取、归并并重写参与的文件成本取决于读取 / 重写字节数与比较次数;应同时报告读、写和空间放大。

时间与空间#

时间复杂度
由 MemTable、层级与压实策略分别决定
存储空间
有效数据 + 旧版本 / 墓碑 + 压实临时空间

不能把 LSM-tree 当成普通平衡树统一标 O(log⁡n)O(\log n);WAL、持久化和后台限速也影响延迟。

工程中的应用#

2 个案例 · 附源码
基础原理参考资料

RocksDB · Overview写前日志、MemTable、SST 和读写路径。

RocksDB · Compaction不同压实策略与读、写、空间放大的权衡。

4 个概念