Clickhouse 数据存储

一、数据分区

        数据是以分区目录的形式组织的,每个分区独立分开存储.这种形式,查询数据时,可以有效的跳过无用的数据文件。

1.1 数据分区的规则

        分区键的取值,生成分区ID,分区根据ID决定。根据分区键的数据类型不同,分区ID的生成目前有四种规则:
(1)不指定分区键
(2)整形
(3)日期类型(主要根据日期进行分区)
(4)其他类型
数据在写入时,会对照分区ID落入对应的分区

1.2分区目录的生成规则

        partitionID_MinBlockNum_MaxBlockNum_Level
BlockNum是一个全局整型,从1开始,每当新创建一个分区目录,此数字就累加1。

MinBlockNum:最小数据块编号。
MaxBlockNum:最大数据块编号。

对于一个新的分区,MinBlockNum和MaxBlockNum的值相同: 2020_03_1_1_0,2020_03_2_2_0
*Level:合并的层级,即某个分区被合并过得次数。不是全局的,而是针对某一个分区。

1.3分区目录的合并过程

MergeTree的分区目录在数据写入过程中被创建。
不同的批次写入数据属于同一分区,也会生成不同的目录,在之后的某个时刻再合并(写入后的10-15分钟),合并后的旧分区目录默认8分钟后删除。
同一个分区的多个目录合并以后的命名规则:
。MinBlockNum:取同一分区中MinBlockNum值最小的
。MaxBlockNum:取同一分区中MaxBlockNum值最大的
·Level:取同一分区最大的Level值加1

二、索引文件

2.1 稀疏索引

        primary.idx文件的一级索引采用稀疏索引。
        稠密索引: 每一行索引标记对应一行具体的数据记录。

        稀疏索引:每一行索引标记对应一段数据记录(默认索引粒度为8192)。

 稀疏索引占用空间小,所以primary.idx内的索引数据常驻内存,取用速度快!

2.2 一级索引

文件:primary.idx
MergeTree的主键使用Primary Key定义,主键定义之后,MergeTree会根据index granularity间隔(默认8192)为数据生成一级索引并保存至primaryidx文件中。这种方式是稀疏索引

        **简化形式:通过order by指代主键**

2.3索引生成规则

三、 索引如何执行查询操作

索引的查询过程
索引是如何工作的?对primaryidx文件的查询过程**MarkRange:一小段数据区间**按照index granularity的间隔粒度,将一段完整的数据划分成多个小的数据段,小的数据段就是MarkRangeMarkRange与索引编号对应
案例
共200行数据
indexgranularity大小为5
主键ID为Int,取值从0开始
根据索引生成规则,primary.idx文件内容为:

 执行过程

        

.bin 原始数据 .mark 索引映射 

 形成一个压缩块

 整体数据查询过程

 

 

.bin文件形成多个压缩块->.mark文件找到压缩块 ->索引块->解压->再找数据

 

数据写入过程

 

 查询过程

 

猜你喜欢

转载自blog.csdn.net/qq_16803227/article/details/132149319