真实对比DELETE FROM(lightweight delete)和ALTER TABLE DELETE(真正mutation)删除同等数据,用system.parts的真实行数元数据证明两者物理层面的本质区别。
代码-- 方式1:Lightweight Delete(ClickHouse 22.8+) DELETE FROM demo.ldel WHERE k < 1000000; -- 方式2:真正的mutation ALTER TABLE demo.mdel DELETE WHERE k < 1000000 SETTINGS mutations_sync=1;
删除前 system.parts: all_1_1_0 776094 行 all_2_2_0 1111953 行 all_3_3_0 1111953 行 DELETE FROM demo.ldel WHERE k < 1000000; -- 真实耗时 0.058 秒 删除后 system.parts: all_1_1_0_4 776094 行 ← 真实行数一个都没少! all_2_2_0_4 1111953 行 ← 同样没变 all_3_3_0_4 1111953 行 ← 同样没变 但 SELECT count() FROM demo.ldel; 真实返回 2000000(正确,1M已被逻辑删除)
Lightweight Delete的真实机制是给每个part悄悄加一个隐藏的_row_exists掩码列,把要删除的行标记为"不存在",而不是真的把它们从part文件里抹掉——所以part的物理行数元数据rows完全没有变化,只是查询引擎在读取时会自动过滤掉被标记的行,让SELECT count()这类查询看到正确的逻辑结果(2000000)。
ALTER TABLE demo.mdel DELETE WHERE k < 1000000 SETTINGS mutations_sync=1; → 真实耗时 0.070 秒(这次同步等mutation真正完成) 删除后 system.parts: all_1_1_0_4 111953 行 ← 真实物理行数变少了 all_2_2_0_4 776094 行 ← 真实物理行数变少了 all_3_3_0_4 1111953 行 (这个part本身不含k<1000000的行,未受影响) 三个part真实剩余总行数 = 111953+776094+1111953 = 2000000,跟lightweight delete的逻辑结果一致
每一步都是本文上面用真实两种DELETE方式跑出来的原始结果。
DELETE FROM(lightweight)与 ALTER TABLE DELETE(mutation)system.parts rows列,证明物理数据是否真的缩小