clickhouse

原来你以为的风平浪静其实都是在蓄势待发

好久不用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没有指定默认值 他的默认值-优快云博客

修改

写能力

采用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 查询慢-优快云博客

分片

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-优快云博客很详细了

查询语句

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.youkuaiyun.com/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.youkuaiyun.com/qq_21125183/article/details/92683192 这个spark写的不错图文并茂

https://zhuanlan.zhihu.com/p/98135840

ClickHouse 架构概述 | ClickHouse Docs

https://blog.youkuaiyun.com/bluetjs/category_7664682.html

https://blog.youkuaiyun.com/u013007900/category_9271511.html

干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用_clickhouse 亿级 group by-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值