首页/数据/数仓建模速查/MergeTree 家族引擎选择
湖仓与引擎63 条

MergeTree 家族引擎选择

MergeTree 是基础引擎,ReplacingMergeTree 支持按排序键去重、SummingMergeTree 支持预聚合、CollapsingMergeTree 用标记列处理状态变更。

数仓建模速查数据更新于 2026-10-13

MergeTree 家族是什么

MergeTree 是 ClickHouse 的默认存储引擎族,共同特征是数据按 ORDER BY 的顺序写入,落成一个个不可变的 data part,由后台线程持续合并。在基础引擎之外,各变体规定了「合并时同排序键的多行怎么处理」:Replacing 保留版本最新的一行,Summing 把数值列加起来,Aggregating 保留聚合中间状态,Collapsing 按符号列把正负两条折叠掉。这些行为都发生在后台合并阶段,而不是写入的瞬间。

基本信息

适用平台ClickHouse(MergeTree 族自 1.x 起为主力引擎)
基础引擎MergeTree:不去重,全量追加
关键子句ORDER BY(必填)、PARTITION BY、PRIMARY KEY(默认取 ORDER BY)
去重时机后台异步合并完成,写入后不立即生效
精确去重读法查询加 FINAL,或按版本列 argMax 聚合后再过滤
手动触发合并OPTIMIZE TABLE ... FINAL,开销大,不宜频繁执行
删除方式ALTER TABLE ... DELETE 属于异步 mutation;新版本另有轻量级删除

典型使用场景

  • 日志、事件明细只做追加查询,用 MergeTree,写入吞吐最高
  • 维表要保留实体最新状态,用 ReplacingMergeTree(版本列),重复写入同键时自动留最新
  • 指标表维度固定、只做求和,用 SummingMergeTree 在合并时提前把数值列相加
  • 需要 count/distinct 这类可合并状态时,用 AggregatingMergeTree 配合物化视图增量维护
  • 有撤单、作废等行级撤销场景,写入成对的正负记录,用 CollapsingMergeTree 合并时抵消

常用引擎建表示例

常用引擎建表示例
CREATE TABLE dw.dim_store (           -- 维表:同键留版本最新的一行
  store_id   String,
  store_name String,
  version    UInt64,
  is_deleted UInt8 DEFAULT 0
)
ENGINE = ReplacingMergeTree(version)  -- 参数是版本列,越大越新
ORDER BY store_id;

CREATE TABLE dw.sale_sum_day (        -- 指标:合并时按排序键把数值列求和
  dt       Date,
  store_id String,
  pay_amt  Decimal(18,2)
)
ENGINE = SummingMergeTree(pay_amt)
PARTITION BY toYYYYMM(dt)
ORDER BY (dt, store_id);

-- 强制合并后再查,可拿到去重/聚合后的结果(大表慎用)
OPTIMIZE TABLE dw.dim_store FINAL;

引擎逐项对照

引擎同键行为典型用途
MergeTree不去重不聚合,全部保留通用明细表、日志
ReplacingMergeTree保留版本列最大的一行维表、需要去重的明细
SummingMergeTree数值列按排序键求和固定维度的预聚合指标
AggregatingMergeTree保留聚合状态,查询时 merge物化视图增量聚合
CollapsingMergeTree按 Sign 正负成对抵消状态变更、行级撤销
SummingMergeTree 只保证聚合列被相加,其余非聚合列在合并后取到的是哪一行并不确定,不要把业务字段放在那里依赖取值。
对 ReplacingMergeTree 做精确查询,加 FINAL 最省事但会实时合并;数据量大时改用 GROUP BY 键配合 argMax(行, version) 更可控。CollapsingMergeTree 要求正负行写入顺序严格,乱序场景应改用 VersionedCollapsingMergeTree。

易错点

  • 以为 ReplacingMergeTree 写入即去重:后台合并前查询会出现重复行,下游统计偏大
  • 对亿级表频繁执行 OPTIMIZE ... FINAL:触发大规模合并与 IO 风暴,拖慢整机查询
  • 在 SummingMergeTree 的非聚合列上做业务判断:合并后该列取值不定,逻辑时对时错
  • CollapsingMergeTree 的正负行写入不配对或顺序错乱:撤销不生效,指标只增不减
  • 排序键把低基数列放在最前:稀疏索引过滤效果差,扫描量接近全表

数据来源与参考

  • ClickHouse 官方文档:MergeTree Engine Family
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌