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。