原来你以为的风平浪静其实都是在蓄势待发
好久不用clickhouse,本来以为公司不用了,结果这几天统计数据载在这上面了,再查clickhouse发现版面都变了了,加油吧,话说clickhouse真的是很强大
再次出发,肯定要来点不一样的
列式存储
同一列中的数据属于同一类型,压缩效果显著,data size更小从磁盘读取更快
不同类型可选择不同压缩算法,高压缩比内存放更多数据,系统cache效果佳
稀疏索引
clickhouse支持对任意列创建任意数量的稀疏索引
本质上是对一个ndex granularity行数据的统计信息,不会记录每行的位置
类型
- minmax:以index granularity为单位,储存指定表达式计算后的min、max值,查询中跳过不满足条件的块,减少IO
- set(max_rows)以index granularity为单位,储存指定表达式的distinct value集合,快速判断等值查询是否命中该块,减少IO
- ngrambf_v1(n,size_of_bloom_filter_in_bytes,number_of_hash_functions,random_seed)将string进行ngram分词构建bloom filter,优化等值、like、in等查询条件
- tokenbf_v1(size_of_bloom_filter_in_bytes,number_of_hash_functions,random_seed)与上类似,不适应ngram分词通过标点符号词语分割
- bloom_filter([false_positivel])对指定列构建bloom filter,加速等值、like、in查询
引擎是一大利器
常用的有log、还有mergeTree,mergeTree支持主键 要求有日期字段
ENGINE = MergeTree(create_date, (state_province), 8192);数字是index granularity 索引粒度默认即8192,数据由多组按主键进行字典序排列的part文件组成;主键的数据结构:每列数据按index granularity划分,划分后每block第一行成为mark行,主键索引储存mark行对应的主键值
where中含主键查询,通过主键二分查找定位到index granularity
还是有些迷糊,在表的分区中包括校验值、列名、列.mrk、列.bin、主键
某主键counterID,Date储存示意图:
主键不是唯一,可以插入主键相同的数据行
mergeTree
支持一个日期和一组主键的两层式索引,可实时更新数据
结合上下文看看一个简明的例子:ClickHouse 使用_clickhouse string没有指定默认值 他的默认值-CSDN博客
修改
写能力
采用LSM Tree结构:the log structured merge -tree,key-value储存系统,利用磁盘顺序写,关于LSM TreeLSM-tree 基本原理及应用 - 简书这里有比较简明的介绍,分层读写,key-value顺序执行
删除、更新通过支持mutation来实现alter table delete where filter_expr,alter table update col=val where filter_expr
计算
数据划分为多个partition,每个partition进一步划分为多个index granularity,多个CPU分别处理实现并行数据处理
可线性拓展分布式计算能力,将查询拆解为多个task下发到集群中,多机并行处理
多副本时多种查询下发策略:
- 随机下发,多个replica随机选择
- 最近hostname,最近的节点,可降低网络延时,确保query下发到固定的replica机器,利用系统cache
- in order按照特定顺序逐个尝试下发,第一个不可用顺延下一个
- first or random 第一个不可用随机选择一个保证其余副本间负载均衡,在跨region复制场景下通过设置第一个replica为本region内副本,降低网络时延
动态代码生成runtime codegen
expression级别的runtime codegen,据当前sql直接生成代码编译执行,消除了虚函数调用(如图function pointer调用)运行时表达式的参数类型、个数已知,消除if-else判断
SIMD single instruction multiple date
单指令多数据流,采用一个控制器来控制多个处理器:对同一组数据中每一个分别执行相同的操作实现空间并行性
ck大量并行计算单机性能,通过列式存储查询时map化,每列操作向量化(增加并发)单机效率极高
mergeTree
sql优化
1、分区:常一起用到的数据放到相同区
2、主键order by字段:where里肯定有的字段加到里面且放到第一位
索引优化
1、索引结构是稀疏索引,开始字段应该是区分度中等的字段
区分度很高字段是索引一部分时用字段定位区间是全部数据,全部数据加载到内存再找符合条件的记录,慢;无该索引先用字段匹配仅读取一列
clickhouse的索引结构和查询优化_clickhouse 查询慢-CSDN博客
分片
clickhouse也支持分布式,将数据分为多个分片且分布到不同节点,不同分配策略在不同sql pattern时各有优势
- random写入数据被随机分发到分布式集群中的某个节点
- constant写入数据分发到固定的一个节点上
- column value按某一列的值hash分片
- 自定义表达式:据表达式(任意合法的)被计算后的值进行hash分片
hash分片join计算能避免数据shuffle在本地local join
以下是某大厂使用探索,谢谢分享携程用ClickHouse轻松玩转每天十亿级数据更新_DataX
1、join会那右表中的每一条数据到左表查找是否改记录存在,所以将小表放到右边
不存在右表相应字段返回该字段类型的默认值,拒绝这种处理方式可添加join_use_nulls配置
2、通过jdbc批量写入数据时,控制每批次的数据中涉及到的分区数量
写入前通过order by排序:无序数据可能涉及过多分区导致无法及时合并新数据、影响查询性能
避免使用分布式表(性能不高),建表时分区字段不宜过多(否则易打满磁盘)
3、关注CPU,注意查询超时情况,设置报警
集群分片副本Clickhouse集群应用、分片、复制_httphandler: code: 279, e.displaytext() = db::nete-CSDN博客很详细了
查询语句
1 [with expr_list | (subquery)]
select [distinct] expr_list
3 [from [db.]table | (subquery) | table_function ] [final]
[sample sample_coeff]
5 [array join ……]
[global] [any|all] [inner | left |right|full|cross] [outer] join (subquery) |table using columns_list
7 [prewhere expr]
8 [where expr]
[group by expr_list] [with totals]
10 [having expr]
[order by expr_list]
12 [limit [offset_value,] n By columns]
[limit [n,]m]
14 [union all ……】
[into outfile filename]
16 [format format]
[]标识可选择性使用
第一行查询可以被第二行使用
第二行过于基础、略
第4行只能在mergetree家族中使用且表创建时指定,抽样,抽取部分推出全局
SELECT <expr_list>
FROM <left_table>
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN <right_table>
(ON <expr_list>)|(USING <column_list>) ...
注意哦left|right join 是不行的哦弟弟妹妹们
https://blog.csdn.net/HappyRocking/article/details/79885071?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase这个虽然是hive的但是可以有些启发
https://blog.csdn.net/qq_21125183/article/details/92683192 这个spark写的不错图文并茂
https://zhuanlan.zhihu.com/p/98135840
ClickHouse 架构概述 | ClickHouse Docs
https://blog.csdn.net/bluetjs/category_7664682.html
https://blog.csdn.net/u013007900/category_9271511.html
干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用_clickhouse 亿级 group by-CSDN博客