首页 > 其他分享 >聊下 Clickhouse MergeTree 的分区,索引,标记和压缩数据

聊下 Clickhouse MergeTree 的分区,索引,标记和压缩数据

时间:2023-02-08 20:11:05浏览次数:42  
标签:8192 压缩 解压缩 偏移量 索引 聊下 数据 MergeTree Clickhouse

今天花了一天把 《ClickHouse 原理解析与应用实践》过了一遍,除了感叹诸多结构都为了节省每一个 byte 做到极致,也感受到要理解某些设计又一点压力。

看完之后我感觉差不多理解了,抽几个重点略微总结一下,日后忘了可回来看看。

 

数据的查询过程

数据的查询过程,我通过书上的这张图来说,要理解 .mrk .primary .bin 我感觉需要完全理解这个图。

 

这张图表述如何连接 .mkr和 .bin文件。也就是说如何通过标记文件来寻找对应的压缩块在哪儿。

.mrk 中保存的是解压缩块中的偏移量位置,和压缩块中的偏移量位置。这里让我们慢一点来描述这个问题。

1. 压缩块中偏移量我们一直要读到和 0 不一致,最终我们得到 [0, 12016)这个区间。这里我解释一下为什么有 8 个偏移量为 0 的元素。这里 JavaEnable 是 UInt8 型字段 占用 1Byte 空间。

一个块大概有 65536 Byte 64KB 空间,JavaEnable 8192 行正好可以占据 8192 Byte 空间,那么要填满一个块 65536 Byte / 8192 Byte = 8 个空间。所以得到这里 8 个元素都为第 0 个块。那你可能要问了,我不是压缩的数据吗?但是要知道 压缩块偏移量和解压缩块偏移量是一一对应的。当再增加数据,解压缩块偏移量就不够用了就需要换一个块了。自然记录压缩块偏移量的 offset 就变化了。如果没有理解,停下来再想想。

2. 解压缩块中的偏移量我们也要一直读到和 0 不一致,最终我们得到了 [0, 8192] 这个区间。但是对应着一个完整的块我们应该是 [0, 65536) 这个区间。

总结一下 .mkr 描述文件块 0,一个获取压缩之后的位置偏移量,一个获取解压缩之后的位置偏移量。注意「压缩块中的偏移量」和 「解压缩块中的偏移量」这两个是一一对应的,最终.mrk 你会得到这样一个东西。

编号 压缩块中的偏移量 解压缩块中的偏移量
0 0 0
1 0 8192
2 0 16384
3 0 24576
4 0 32768
5 0 40960
6 0 49152
7 0 57344
8 12016 0

3. 然后回到 .bin 文件中寻找对应块需要结合 primary.idx, 注意 primary.idx 同样和 .mrk 是一一对应的。所以我们会得到这么一个东西。

编号 CounterID
0 57
1 1635
2 3266

所以当我们要查一个主键 CounterID = 1000 的数据是怎么查的呢?

1. 根据 where CounterID = 1000 得到我们 primary.idx 中需要得到编号0 到编号1 这个区间里面的东西 [57, 1635)。

2. 然后找到 .mrk 编号为 0 对应的块 offset 这里压缩块 offset 就是 0 。

3. 根据该 offset 找到压缩块位置,读取整个块解压然后再 2 分查找 CounterID = 1000 的记录即可(没看代码,猜测可以用二分因为有顺序)。

 

数据的写入过程

 

首先我们假设我们创建的是一张带分区表。

8873898 行记录通过 34 批次写入合并了三次。所以最后我们得到的文件是 201403 分区 1 最小块 34 最大块 3次合并。 这是 201403_1_34_3 数据块的由来。

默认配置 index_granularity = 8192 当我们写入数据之后,会每 8192 行生成 1 个稀疏索引。

1. 所以第 1 排待写入数据就是稀疏索引的情况,「数据间隔0」「数据间隔1」「数据间隔2」「数据间隔3」。

2. 第 2 排写 primary.idx(一级索引)存储一级索引和索引标记的关系。

3. 维护标记,记录压缩块和非压缩块位置。

4. 如果数据行 8192 行并不能占据满 64KB 块大小空间,那么可以继续留着下一个 8192 行使用。 如果 8192 行数据在 64KB 到 1MB 这个区间,那么直接使用一个块。如果超过 1MB 就使用

多个块来维护 8192 行数据即可。

 

行差不多,另外一部分重要的分区以及分片,得等我深度测试一下再说。

 

标签:8192,压缩,解压缩,偏移量,索引,聊下,数据,MergeTree,Clickhouse
From: https://www.cnblogs.com/piperck/p/17103149.html

相关文章

  • 001.clickhouse-创建库表
    clickhouse登录-多行模式clickhouse-client--host=x.x.x.x--port=9000--user=xxxx--password=xxxx-mn clickhouse分普通表创建 CREATETABLEdefault.tmp_......
  • ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析
    目录建表语法查询和插入数据数据处理逻辑ClickHouse相关资料分享AggregatingMergeTree引擎继承自MergeTree,并改变了数据片段的合并逻辑。ClickHouse会将一个数据片段内所......
  • clickhouse http 导入数据
    curl --data-binary@localpath'http://host:port?database=databasename&date_time_input_format=best_effort&query=INSERT%20INTO%20tablename%20%20FORMAT%20CSV'-......
  • ClickHouse SQL调优及执行计划分析
    ClickHouse在做SQL查询时要尽量遵循的原则1.大表在左,小表在右,否则会造成右表加载数据量太大,大量消耗内存资源;2.如果join的右表为大表,则需要将右表写成子查询,在子查询中将......
  • 查看ClickHouse中某个表的详情
    进入终端:sudodockerexec-itmsun-clickhouseclickhouse-client--port10000--user用户--password密码-mselect  database,  table,  formatRead......
  • ClickHouse的语句优化策略
    一使用执行计划​​ClickHouse官网执行计划详解​​平常写sql的时候,有时候因为我们的有限的水平,写出的sql很差,ck为我们提供了执行计划查询的方法,通过此,我们可以优化我们的......
  • ClickHouse 实现数组交并差计算
    计算数组交集函数:arrayIntersect(arr1,arr2,...)功能说明:计算arr1,arr2等数组元素交集。返回值:交集元素子数组。SQL实例:SELECTarrayIntersect([1,2,3],[4,......
  • ClickHouse分布式安装-Docker环境
    安装背景本文主要介绍了在Docker环境下如何安装ClickHouse集群的过程,ClickHouse集群采用单分片三副本模式进行部署。服务器:bigdata1、bigdata2、bigdata3zookeeper:需要安装z......
  • 《ClickHouse原理解析与应用实践》关于P239[分片规则]错误的地方
     《ClickHouse原理解析与应用实践》关于P239[分片规则]错误的地方 快过年了,坚守到最后一天。刚好开发有新的想法,需要用到ReplacingMergeTree引擎实现去重或删除数据......
  • Docker容器化急速部署ClickHouse
    文章目录1.ClickHourse入门简介2.Docker部署ClickHouse3.DBeaver连接ClickHouse1.ClickHourse入门简介(1)什么是行存储传统的OLTP关系型数据库都是行存储一行中......