基本思想

借鉴了LSM-Tree,但不完全一样,核心思想: 写入走顺序追加,不原地更新;后台异步合并小块成大块。 这和B+ Tree的原地更新、维护有序完全不同。

工作方式

写入路径

  1. 按照用户定义的order by键内部排序
  2. 按列拆分,每列压缩成一个.bin文件
  3. 生产稀疏主键索引
  4. 把所以文件打包成一个目录 — part

后台工作

后台线程主要做两件事:

  1. 把小part合并为大part
  2. merge的过程中顺便聚合、去重等(merge tree的变体)

查询路径

  1. 根据where条件做分区裁剪
  2. 每个part中用稀疏主键过滤
  3. 只读需要的列文件
  4. 解压、过滤、聚合

MergeTree家族

  • MergeTree:什么都不做,纯存储
  • ReplacingMergeTree:merge 时按主键去重,保留最新版本。近似实现 upsert
  • SummingMergeTree:merge 时按主键把数值列加起来。预聚合场景
  • AggregatingMergeTree:更通用的预聚合,配合 AggregateFunction 类型
  • CollapsingMergeTree / VersionedCollapsingMergeTree:通过 +1/-1 标记位实现”删除”,merge 时抵消
  • GraphiteMergeTree:专门给 Graphite 监控数据做 rollup 用