1 ClickHouse适用场景
当场景满足如下大部分场景时,即可调研尝试使用ck。
01、绝大多数请求都是用于读访问,而且不是单点访问
02、数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更新操作
03、数据只是添加到数据库,没有必要修改
04、读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
05、表很“宽”,即表中包含大量的列
06、查询频率相对较低(通常每台服务器每秒查询数百次或更少)
07、对于简单查询,允许大约50毫秒的延迟
08、列的值是比较小的数值和短字符串( 例如,每个URL只有60个字节)
09、在处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)
10、不需要事务
11、数据一致性要求较低
12、每次查询中只会查询一个大表。除了一个大表,其余都是小表
13、查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小
2 经典大厂案例分析
2.1 分组求topn-TopK
创建表:
create table topn_test(a Int32, b Int32, c Int32) ENGINE=Memory;
插入数据:
insert into topn_test( a,b,c) values (1,2,5),(1,2,4),(1,3,8),(1,3,2),(1,4,6),C2,3,3),(2,3,7),(2,3,8),C2,4,9),C2,5,6),(3,3,4),(3,3,7),(3,3,5),(3,4,9),(3,5,6);
查询SQL:
select * from topn_test2 order by a desc;
分组topK:以a分组,取c top3的数据
select a, topK(3)(c) from (select a,c from topn_test2 order by a asc ,c desc ) group by a order by a;
相较于hive的开窗函数,最上层的select不能获取group by 、order by 之外的字段。而且topK是集合。
**注意:**当表是分布式表时这个操作只能获取每台机器上的表的TopK,比较坑,再次验证ck是单机单表性能强悍的数据库。
2.2 窗口分析函数-over partition
Window Functions在clickhouse的需求和呼声很高,早期的版本需要借助array函数,在21.1版本进行了开窗函数的初步支持。
查询版本:
select version();
开启参数:
SET a11ow_experimental_window_functions = 1;
创建表:
create tab1e window_test(id String, score UInt8) engine=MergeTree() order by id;
生成测试数据:
insert into window_test(id,score) values('A',90),('A',80),('A',88),('A',86),('B',91),('B',95),(