关于clickhouse的几点总结和建议

这段时间通过对clickhouse的使用和测试,分线一些使用心得和建议。由于数据保密,过程就不展示了,直接看总结。

集群情况

① 集群共有14台clickhouse-server。

② 本地表使用ReplicatedMergeTree引擎,用来写入数据;

③ 分布式表用来查询;

④ kafka表用来接入kafka数据;

⑤ 另外还有一个物化视图用于将kafka表导入本地副本表。

⑥ 单表数据量在5千多亿,大概19T左右。

入库

总体服务器负载和cpu使用率偏高,可以看出clickhouse是非常吃CPU的。

查询

① 总体查询效率比较高,如果分区范围合理,查询压力基本不大

② 查询时使用单条件查询比较快

③ 查询时使用分区字段比较快

④ select的时候尽量指定查询字段名,会比较快,因为列式存储的特性

⑤ 过滤条件不需要满足最左匹配原则,只需要过滤条件包含在索引列中即可

⑥ 简单聚合需求效率比较高,复杂聚合需求会造成内存溢出,也有可能是因为表数据量大的缘故

优点

① 数据按列存储,支持向量化

② 过滤条件不需要满足最左匹配原则,只需要过滤条件包含在索引列中即可

③ 写入速度比较快,每小时20亿数据毫无压力

④ 单表查询效率很高

⑤ 对于聚合需求,可以使用物化视图加速查询

⑥ 支持python和java udf函数

缺点

① 数据的删除和更新支持的不好

② 不支持高并发,官方建议qps为100,不建议在高并发场景中使用

③ join的写法比较特殊

④ 对CPU要求比较高

⑤ 集群运维门槛比较高,需要对clickhouse架构比较熟悉

⑥ 修改表结构比较复杂,需要同时修改本地表、分布式表、kafka表和物化视图

⑦ 服务器扩容需要手动操作,且需要重启服务器,副本数据均衡需要通过代码手动实现

⑧ 支持多目录配置,需要修改集群配置文件,并对不同表设置不同的存储策略,默认策略只能配置一个磁盘路径

⑨ 不支持事务

⑩ 表结构变更支持的不好,操作过程一言难尽

使用建议

① 使用时,关闭虚拟内存,物理内存和虚拟内存的数据交换,会导致查询变慢。

② 建表时,尽量使用后续用的比较频繁的字段做排序字段(order by),以及时间字段来做分区(partition)。如果后续查询用不到分区,尽量使用非分区表,查询效率比较高。所以,是否建立分区表跟后续的查询场景相关。

③ 尽量使用排序字段和分区字段做查询条件,分区时间范围尽量缩小

④ select语句中避免使用*

⑤ 尽量将数据汇总成大宽表查询,避免join操作

⑥ 对于需要计算的聚合指标,可以使用物化视图提前预聚合,但是查询时要指定具体的物化视图名称,不能直接使用表名查询

写在最后

以上总结和建议建立在真实测试的基础上,如果有不合理或者不完善的地方欢迎指出,共同探讨和学习。


往期推荐

ClickHouse UDF 实践

看完这篇,你就知道怎么选用ClickHouse表引擎了

Apache Doris和ClickHouse的深度分析



请使用浏览器的分享功能分享到微信等