ClickHouse 2016年开源的,由俄罗斯IT公司Yandex开发,是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),而且查询性能优越。
主要特点: 面向列+向量执行; 自己管理存储(非Hadoop); 线性可扩展,高可靠(通过shard+replication实现); DDL(数据定义语言):可以动态地创建、修改或者删除数据库、表和视图,而无需重启服务; DML(数据操作语言):可以动态地查询、插入、修改或删除数据; 权限控制:可以按照用户粒度设置数据库或者表的操作权限,保障数据的安全性。
使用的场景:单表分析,这个表可以很宽。
不足: update or delete支持较弱; 不擅长根据主键按行粒度进行查询(虽然支持),所以不应该把 ClickHouse 当做键值对数据库使用。 总原则:能够提前过滤,一定要提前过滤。
1 列裁剪与分区裁剪: 数据量太大时应避免使用 select * 操作,查询的性能会与查询的字段大小和数量成线性表换,字段越少,消耗的 io 资源越少,性能就会越高。
select * from datasets.test;
select test1,test2,test3,test4,test5 from datasets.test;
分区裁剪就是只读取需要的分区,在过滤条件中指定。
select test1,test2,test3,test4,test5 from datasets.test where test1='2022-03-23';
2 order by 结合 where、limit: 千万以上数据集进行 order by 查询时需要搭配 where 条件和 limit 语句一起使用。
select test1,test2,test3,test4,test5 from datasets.test where test1='2022-03-23' order by test2 desc limit 1000;
select test1,test2,test3,test4,test5 from datasets.test order by test2 desc;
3 避免构建虚拟列: 如非必须,不要在结果集上构建虚拟列,虚拟列非常消耗资源浪费性能,可以考虑在前端进行处理,或者在表中构造实际字段进行额外存储。
select test1,test2,test1/test2 as result,test3,test4,test5 from datasets.test;
select test1,test2,test3,test4,test5 from datasets.test;
4 大小表 JOIN: 多表 join 时要满足小表在右的原则,右表关联时被加载到内存中与左表进行比较,ClickHouse 中无论是 Left join、Right join 还是 Inner join 永远都是拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表。
5 数据类型: 建表时能用数值型或日期时间型表示的字段,就不要用字符串——全String类型在以Hive为中心的数仓建设中常见,但CK环境不应受此影响。 虽然clickhouse底层将DateTime存储为时间戳Long类型,但不建议直接存储Long类型,因为DateTime不需要经过函数转换处理,执行效率高、可读性好。
参考资料: https://wenku.baidu.com/view/8e23b03056270722192e453610661ed9ad51551c.html clickhouse踩坑记录 https://blog.csdn.net/clearlxj/article/details/121851727 ClickHouse-查询优化 https://blog.csdn.net/shouwantao3369/article/details/117674172 Clickhouse查询优化问题记录 https://blog.csdn.net/abcd1101/article/details/55225920 sql执行顺序以及on和where的区别 https://blog.csdn.net/weixin_32842959/article/details/113514220 mysql先where再join_sql(join on 和where的执行顺序) https://segmentfault.com/a/1190000039719297 ClickHouse的入门、使用和优化 https://www.cnblogs.com/traditional/p/15218565.html ClickHouse 的基本介绍,什么是 ClickHouse?
|