学习clickhouse详细知识
刘梦凯 Lv3

ClickHouse基础应用与内部原理

MergeTree原理解析

MergeTree是家族中最基础的表引擎,提供了主键索引、数据分区、数据副本和数据采样等基本能力,而家族中其他的表引擎则在MergeTree的基础之上各有所长。

MergeTree建表语句中重要的参数:

(1)PARTITION BY [选填]:分区键,用于指定表数据以何种标准进行分区。分区键既可以是单个列字段,也可以通过元组的形式使用多个列字段,同时它也支持使用列表达式。如果不声明分区键,则ClickHouse会生成一个名为all的分区。合理使用数据分区,可以有效减少查询时数据文件的扫描范围。

(2)ORDER BY [必填]:排序键,用于指定在一个数据片段内,数据以何种标准排序。默认情况下主键(PRIMARY KEY)与排序键相同。排序键既可以是单个列字段,例如ORDER BY CounterID,也可以通过元组的形式使用多个列字段,例如ORDERBY(CounterID,EventDate)。当使用多个列字段排序时,以ORDERBY(CounterID,EventDate)为例,在单个数据片段内,数据首先会以CounterID排序,相同CounterID的数据再按EventDate排序。

(3)PRIMARY KEY [选填]:主键,顾名思义,声明后会依照主键字段生成一级索引,用于加速表查询。默认情况下,主键与排序键(ORDER BY)相同,所以通常直接使用ORDER BY代为指定主键,无须刻意通过PRIMARY KEY声明。所以在一般情况下,在单个数据片段内,数据与一级索引以相同的规则升序排列。与其他数据库不同,MergeTree主键允许存在重复数据(ReplacingMergeTree可以去重)。

数据存储结构

​ MergeTree中的主键一般通过order by指定,主键可以是单个字段也可以是多个字段,根据主键建立索引,这里涉及到两个参数index_granularity以及enable_mixed_granularity_parts,前者是指定我们创建稀疏索引时候的索引间隔,默认是8192,后者是我们选择是否开启根据写入数据体量大小的自适应索引的参数,默认是开启的,两者支持同时开启并同时生效,详细参考这篇文章,设置index_granularity_bytes=0即为关闭自适应索引

数据存储结构主要文件有以下几个,.idx文件是一级索引文件,.bin是数据文件,.mrk是数据标记文件,首先根据idx稀疏索引文件找到要读取的数据段,因为idx文件和mrk文件是一一对应的,找到下一步找到mrk文件中压缩后偏移量和压缩前偏移量

  • Post title:学习clickhouse详细知识
  • Post author:刘梦凯
  • Create time:2021-10-08 19:21:49
  • Post link:https://liumengkai.github.io/2021/10/08/学习clickhouse详细知识/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.