基本思想
借鉴了LSM-Tree,但不完全一样,核心思想: 写入走顺序追加,不原地更新;后台异步合并小块成大块。 这和B+ Tree的原地更新、维护有序完全不同。
工作方式
写入路径
- 按照用户定义的
order by键内部排序 - 按列拆分,每列压缩成一个
.bin文件 - 生产稀疏主键索引
- 把所以文件打包成一个目录 — part
后台工作
后台线程主要做两件事:
- 把小
part合并为大part - merge的过程中顺便聚合、去重等(merge tree的变体)
查询路径
- 根据
where条件做分区裁剪 - 每个
part中用稀疏主键过滤 - 只读需要的列文件
- 解压、过滤、聚合
MergeTree家族
- MergeTree:什么都不做,纯存储
- ReplacingMergeTree:merge 时按主键去重,保留最新版本。近似实现 upsert
- SummingMergeTree:merge 时按主键把数值列加起来。预聚合场景
- AggregatingMergeTree:更通用的预聚合,配合
AggregateFunction类型 - CollapsingMergeTree / VersionedCollapsingMergeTree:通过 +1/-1 标记位实现”删除”,merge 时抵消
- GraphiteMergeTree:专门给 Graphite 监控数据做 rollup 用