前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有料-clickhouse单机的增删查询实现方案和clickhouse分布式部署的增删查改实现方案

有料-clickhouse单机的增删查询实现方案和clickhouse分布式部署的增删查改实现方案

作者头像
公众号-利志分享
发布2022-04-25 09:21:04
4480
发布2022-04-25 09:21:04
举报
文章被收录于专栏:利志分享

关于增删查改,很多同学都可能觉得这么简单的东西我还不会吗?嗯,大家是觉得简单,但是关于clickhouse的增删查改可还是值得深入了解一下,了解了他们的使用,对数据开发者来说,能避免不少的问题。

我们首先看一下clickhouse单机的增删查改。 我们有这样的一个表:

代码语言:javascript
复制
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

增删查改分别如下:

代码语言:javascript
复制
# 增加
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;
代码语言:javascript
复制
上面的案例是单机的增删查改,如果把单机换成分布式了的话关于增删查改又是怎么样的呢?我们先看一下sql,表也是用上面的表结构。

我们创建表的时候需要调整一下了,创建表需要加上cluster名称才行,关键语句:on cluster ch_cluster。另外我们还需要建一下分布式表,我测试的版本是clickhouse的20版本。

代码语言:javascript
复制
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())
代码语言:javascript
复制
下面我们来看一下增删查改。

增加的实现还是和单机的一样,因为插入数据需要插入指定的一个节点,或者建立分布式表,通过分布式表插入,分布式表的插入量的时候会有copy并且send的数据到其他节点的逻辑,对服务会有比较大的影响,所以一般情况下都不采用插入分布式表的方式。

增加:我们插入一个节点。

代码语言:javascript
复制
insert into app1.test1  values('张三',1,now());
insert into app1.test1 values('李四',2,now());
代码语言:javascript
复制
查询:我需要查询所有的节点数据,需要从分布式表进行查询,否则查询的数据是单个节点的数据。
代码语言:javascript
复制
select*from app1.test1_distributed;

删除:我们按照某个条件,则需要指定cluster进行实现。如下。

代码语言:javascript
复制
alter table app1.test1 on cluster  ch_cluster delete where user_id =2;

修改:修改则也需要参照删除,指定cluster。如下:

代码语言:javascript
复制
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数据到另外节点,影响服务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档