LSM-treeLog-structured merge
将写入积累后批量生成有序文件,后台逐步合并。
- 核心约束
- 多个有序层共同表示逻辑数据,读需解析版本与删除标记。
- 适用问题
- 写入密集的持久化键值存储。
- 边界与取舍
- Compaction 会消耗 I/O;快照与版本保留增加成本。
常见操作#
L 为磁盘层数,r 为实际访问的 sorted runs 数,k 为输出记录数;参数依压实策略变化。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| 写入 | WAL 追加 + MemTable 更新 | 以启用 WAL 的持久化路径为例,配置可关闭 WAL;内存结构、刷盘和后续 compaction 工作也须计入。 |
| 点查找 | 过滤器检查 + 候选文件索引 / 数据块读取 | 层数、L0 文件重叠、Bloom 误判和缓存命中共同决定读放大。 |
| 范围扫描 | 定位各路起点 + 多路有序归并 | 访问 r 路候选时,每个输出可有 堆维护;墓碑和旧版本可能带来额外扫描。 |
| 删除 | 写入墓碑,稍后压实回收 | 逻辑删除并不立即释放全部磁盘空间。 |
| 压实 | 读取、归并并重写参与的文件 | 成本取决于读取 / 重写字节数与比较次数;应同时报告读、写和空间放大。 |
时间与空间#
- 时间复杂度
- 由 MemTable、层级与压实策略分别决定
- 存储空间
- 有效数据 + 旧版本 / 墓碑 + 压实临时空间
不能把 LSM-tree 当成普通平衡树统一标 ;WAL、持久化和后台限速也影响延迟。
工程中的应用#
2 个案例 · 附源码RocksDB 可为 SST 配置 Bloom filter,在读取数据块前排除不可能包含目标键的文件,减少无效查询工作。
附源码片段 · 检索与计算
RocksDB 的分层压实选择若干有序 SST,归并为新文件,在维护读取语义的同时清理可回收记录。
附源码片段 · 存储与数据放置