开始学习《ClickHouse原理解析与应用实践》,写博客作读书笔记。
本文全部内容都来自于书中内容,个人提炼。
第五章:
第6章 MergeTree原理解析
MergeTree作为ck最基础的表引擎,提供了主键索引、数据分区、数据副本和数据采样等基本能力,家族中其他的表引擎则在MergeTree的基础之上各有所长。
6.1 MergeTree的创建方式与存储结构
MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁 盘,且数据片段不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。
6.1.1 MergeTree的创建方式
声明Engine=MergeTree()
MergeTree表引擎几个重要参数:
- PARTITION BY [选填]:分区键。可以多个列字段,支持使用列表达式。不声明分区键,则 ClickHouse会生成一个名为all的分区。
- ORDER BY [必填]:排序键。默认情况下主键(PRIMARY KEY)与排序键相同。可以多个列字段,此时按字段依次排序。
- PRIMARY KEY [选填]:主键。会依照主键字段生成一级索引,默认与排序键相同。MergeTree 主键允许存在重复数据(ReplacingMergeTree可以去重)。【当指定的主键和排序键不同时:】
- 此时排序键用于在数据片段中进行排序,主键用于在索引文件中进行标记的写入。
- 主键表达式元组必须是排序键表达式元组的前缀,即主键为(a,b),排序列必须为(a,b,******)。
- SAMPLE BY [选填]:抽样表达式。声明数据以何种标准进行采样。抽样表达式需要配合SAMPLE子查询使用,这项功能对于选取抽样 数据十分有用,更多关于抽样查询的使用方法会在第9章介绍。
【另外书中还写了settings,但是这个现在的版本已经不再适用。另外新版本还增加了ttl】
- TTL [选填]:指定行的存储持续时间并定义磁盘和卷之间自动部件移动的逻辑。表达式必须有一个Date或者DateTime作为结果,例如`TTL date + INTERVAL 1 DAY`,规则类型 `DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'|GROUP BY`
- SETTINGS[选填]:控制 MergeTree 行为的附加参数,具体的可以参考官网介绍。
6.1.2 MergeTree的存储结构
MergeTree表引擎中的数据是拥有物理存储的,数据会按照分区目录的形式保存到磁盘之上。
一张表文件夹下的存储说明:
partition:分区目录
各类数据文件(primary.idx、 [Column].mrk、[Column].bin等)都是以分区目录的形式被组织存放 的。
相同分区的数据,最终会被合并到同一个分区目录。
checksums.txt:校验文件
使用二进制格式存储。
保存了余下各类文件(primary.idx、count.txt等)的size大小及size的哈希值,用于快速校验文件的完整性和正确性。
columns.txt:列信息文件
明文格式存储。用于保存此数据分区下的列字段信息。