我们都知道,clickhouse不支持直接更新,而是通过merge的方式实现的,上次说了CollapsingMergeTree,它是通过主键,还有一个标识字段,进行数据的折叠,来删除老的数据,今天来说下另外一种删除老的数据的策略:替换,ReplacingMergeTree。

ReplacingMergeTree
该引擎与MergeTree的区别在于,它会删除排序键值相同的重复项。
数据的去重只会在合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先做出计划。有一些数据可能仍未被处理。尽管你可以调用OPTIMIZE语句发起计划之外的合并,但请不要依靠它,因为OPTIMIZE操作会引发大量的数据读写操作。
因此,ReplacingMergeTree适用于在后台清理重复数据,以节省空间。但是它不保证没有重复的数据出现。
建表
1 | CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] |
ReplacingMergeTree的参数
- ver - 版本列,类型为UInt*、Date、DateTime。可选参数
在数据合并的时候,ReplacingMergeTree从所有具有相同排序键的行中,选择一行留下:
a. 如果ver列未指定,保留最后一条
b. 如果ver列已指定,保留ver值最大的版本
实例
建表
1 | CREATE TABLE emp_replacingmergetree |
插入相同主键的两个版本数据
1 | INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 25, 'tech', 20000, 1); |
查看表中数据
1 | localhost :) select * from emp_replacingmergetree; |
手动合并
1 | optimize table emp_replacingmergetree; |
总结
所以,ReplacingMergeTree表引擎会删除排序键重复的数据,留下版本最大的一条,实现删除和更新的操作。
而上次介绍的CollapsingMergeTree会通过数据的新增和删除标记来实现,实现数据的更新会多插入一条数据。
Keep reading, Keep writing, Keep coding.
欢迎关注我的微信公众号,比较喜欢分享知识,也喜欢宠物,所以做了这2个公众号:
喜欢宠物的朋友可以关注:【电巴克宠物Pets】
一起学习,一起进步。
