关于增删查改,很多同学都可能觉得这么简单的东西我还不会吗?嗯,大家是觉得简单,但是关于clickhouse的增删查改可还是值得深入了解一下,了解了他们的使用,对数据开发者来说,能避免不少的问题。
我们首先看一下clickhouse单机的增删查改。 我们有这样的一个表:
CREATE TABLE app1.test1 (`user_name`String,`user_id`Int64,`create_at`DateTime) ENGINE =MergeTree() PARTITION BY toYYYYMM(create_at) ORDER BY create_at SETTINGS index_granularity =8192
增删查改分别如下:
# 增加
insert into app1.test1 values('张三',1,now());
insert into app1.test1 values('李四',2,now());
# 删除
alter table app1.test1 deletewhere user_id =2;
# 查询
select*from app1.test1;
# 修改
alter table app1.test1 update user_name ='张三2'where user_id =1;
上面的案例是单机的增删查改,如果把单机换成分布式了的话关于增删查改又是怎么样的呢?我们先看一下sql,表也是用上面的表结构。
我们创建表的时候需要调整一下了,创建表需要加上cluster名称才行,关键语句:on cluster ch_cluster。另外我们还需要建一下分布式表,我测试的版本是clickhouse的20版本。
CREATE TABLE app1.test1 on cluster ch_cluster (`user_name`String,`user_id`Int64,`create_at`DateTime) ENGINE =ReplicatedMergeTree('/clickhouse/tables/app1.test1/{shard}','{replica}') PARTITION BY toYYYYMM(create_at) ORDER BY create_at SETTINGS index_granularity =8192;
CREATE TABLE app1.test1_distributed on cluster ch_cluster(`user_name`String,`user_id`Int64,`create_at`DateTime) ENGINE =Distributed('ch_cluster','app1','test1', rand())
下面我们来看一下增删查改。
增加的实现还是和单机的一样,因为插入数据需要插入指定的一个节点,或者建立分布式表,通过分布式表插入,分布式表的插入量的时候会有copy并且send的数据到其他节点的逻辑,对服务会有比较大的影响,所以一般情况下都不采用插入分布式表的方式。
增加:我们插入一个节点。
insert into app1.test1 values('张三',1,now());
insert into app1.test1 values('李四',2,now());
查询:我需要查询所有的节点数据,需要从分布式表进行查询,否则查询的数据是单个节点的数据。
select*from app1.test1_distributed;
删除:我们按照某个条件,则需要指定cluster进行实现。如下。
alter table app1.test1 on cluster ch_cluster delete where user_id =2;
修改:修改则也需要参照删除,指定cluster。如下:
alter table app1.test1 on cluster ch_cluster update user_name ='张三2'where user_id =1;
总结: 1:关于clickhouse的单机和分布式的的增删查改差异还是蛮大的,这个使用的时候一定要注意,20版本的只有使用了replicated开头的engine的引擎的表, 才能够在拥有on cluster xxx条件的ddl语句中进行集群更新;其他engine的表, 只能够每个node进行update;distributed_table使用的是Distributed引擎, 所以也不支持on cluster xxx这样条件的ddl语句,21版本修复了这个bug,但是目前阿里云20版本的clickhouse的mergeTree引擎是支持on cluster xxx这样的ddl语句的。 2:关于插入数据尽量都随机一个节点进行插入,不要直接使用分布式表做插入,这样避免插入大量数据出现send并copy数据到另外节点,影响服务。