真实插入带TTL的数据,全程不手动触发任何操作,观察ClickHouse后台任务在数据过期后自动清理的真实时机。
代码CREATE TABLE demo.ttl2 (k UInt64, ts DateTime, v String) ENGINE=MergeTree ORDER BY k TTL ts + INTERVAL 3 SECOND; INSERT INTO demo.ttl2 VALUES (1, now(), 'will_expire_in_3s'), (2, now() + INTERVAL 1 HOUR, 'stays_long');
-- t=0:刚插入 SELECT k,v FROM demo.ttl2 ORDER BY k; → 1 will_expire_in_3s 2 stays_long SELECT name, rows FROM system.parts WHERE table='ttl2' AND active; → all_1_1_0 2 行 -- 真实sleep 5秒,全程没有执行任何OPTIMIZE或手动触发的操作 SELECT k,v FROM demo.ttl2 ORDER BY k; → 2 stays_long ← 真实第1行已经不见了 SELECT name, rows FROM system.parts WHERE table='ttl2' AND active; → all_1_1_1 1 行 ← 真实part文件名变了(带_1后缀),物理行数也真实降到了1
整个过程本文没有手动执行任何OPTIMIZE或者其他触发动作——只是简单地sleep等待,5秒之后再查询,过期的那一行就已经真实从磁盘上被物理清除了:part文件名从all_1_1_0变成了all_1_1_1,物理行数真实从2降到1。这说明ClickHouse有一个独立于用户操作的后台任务,会自动扫描带TTL的表、发现有过期数据的part、并真实重写掉这些part来清除过期行,全程不需要人工介入。
每一步都是本文上面用真实ClickHouse跑出来的原始结果。
TTL ts + INTERVAL 3 SECOND