clickhouse的mergetree表引擎数据查找流程图及特性

MergeTree表引擎数据查找流程图

clickhouse数据查找过程ps:相比起mysql等数据库的查找过程,图中未展示出来的重要优化点是当clickhouse查找到了多个压缩数据块后,他会使用多线程的形式同时读取多个压缩数据块,这样就可以进一步提升性能

mergetree表引擎是clickhouse中最重要的引擎

  1. 他支持数据分区,一二级索引,数据列式压缩存储,数据表的每一列都有单独的column.bin和mark标识文件column.mrk组成,可以支持数据的并行(多线程)查找,顺便提一句: mergetree表的查询速度快的一部分原因是使用多线程已经SIMD并行指令,所以虽然速度很快但是clickhouse查询也是相当耗费cpu,相对于es等olap系统,clickhouse的cpu使用率很高。
  2. mergetree表引擎每次数据写入insert into values xx或者insert into select的时候都会创建新的目录,每次写入一次就会创建一个新的目录文件,类似 2018_min_max_mergeNum的形式,后台会有线程合并这些创建的分区目录,如果写入压力很大,可以有两种解决方案: 方案A,批量写入,这样可以使得创建的每个新的分区目录都很大,这样合并起来性价比就很高,方案B,使用Buffer内存表作为内存缓存表,他可以缓存写入的数据,等到时间到了或者数据行数达到一定阈值后在批量写入目标表中,缺点就是如果服务器中途重启,那么Buffer表的内存数据可能会丢失
  3. mergetree的主键并不是唯一的,也就是说主键是可以重复的,部分去重的话可以使用RepacingMergeTree表,不过ReplacingMergeTree表只是部分去重,也就是分区内才去重,不同分区间是不会去重的,而且去重操作只在合并的时候才会发生。
  4. mergetree还有AggregativeMergetree等表引擎,这些表引擎只保存聚合后的数据,不会保存明细表的数据,有点类似于数据预聚合以及数据立方体的概念,通过预先聚合,可以加快查询速度
  5. MergeTree表引擎中所有列的数据顺序都是按照order by排序的,所以MergeTree引申出来的其他聚合表,去重表的功能都是在合并过程中完成的,并且去重的或者聚合的维度是和order by指定的列保持一致的,因为数据本来就是按照order by排序的,所以合并过程中很容易实现去重或者聚合的功能
  6. MergeTree表引擎进行Alter update或者Alter delete操作时和其他表引擎一样耗时费力,原理都是先把要update或者delete的语句保存到数据目录的mutation.sql表中,然后后台线程异步的读取每个分区的数据,并把update或者delete语句应用到这个分区目录中去,然后把修改或者删除后的数据重新写到另一个分区中去,可想而知,要对数据表中所有的分区目录都重复这样的操作,无论是对cpu还是磁盘都极不友好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值