四个交互演示:① Mutation 重写 Part 动画 · ② 轻量级 DELETE 墓碑机制 · ③ UPDATE 替代方案对照 · ④ Mutation 进度监控
下面是一个 Part 的 5 列内容。点 「ALTER UPDATE score = score+1」,看 ClickHouse 怎么生成新 Part:
表 events 有 8 行。执行 DELETE FROM events WHERE event_type='view',看 ClickHouse 内部做了什么:
| id | user_id | event_type | payload | _row_exists (隐藏) |
|---|
SELECT count() FROM events; -- 引擎自动加 WHERE _row_exists = 1 -- 用户看不到 'view' 行
SELECT sum(rows) FROM system.parts WHERE table='events' AND active; -- 物理行数 > 可见行数 = 墓碑数量
_row_exists 写入快(小 IO)
② 但每次 SELECT 都要带 WHERE _row_exists = 1 过滤
③ 墓碑积累 → 查询慢慢退化 → 需要后续 Merge 物理清理
选择业务场景,看 ClickHouse 推荐用哪种姿势"修改"数据:
ENGINE = ReplacingMergeTree(updated_at) ORDER BY user_id; INSERT 新版本即可 SELECT argMax(name, updated_at) ...
ENGINE = CollapsingMergeTree(sign) ORDER BY order_id; INSERT (... , -1) 作废 INSERT (... , 1) 新版本
ALTER TABLE t MODIFY TTL event_date + INTERVAL 90 DAY DELETE;
ALTER TABLE prod REPLACE PARTITION '202604' FROM staging.t_2026_04;
DELETE FROM events WHERE user_id = 12345;
ALTER TABLE t UPDATE col = ... WHERE ...; -- 实际是 ALTER, 异步
真实环境用 SELECT * FROM system.mutations 跟踪。下面模拟:随时发起 Mutation,可观察进度、并发数、KILL 行为。
| mutation_id | command | parts_to_do | 进度 | 状态 | create_time |
|---|
SELECT mutation_id, command, parts_to_do, is_done, latest_fail_reason FROM system.mutations WHERE database = 'learn_ck' AND NOT is_done ORDER BY create_time; KILL MUTATION WHERE mutation_id = 'mutation_42.txt';