Clickhouse原理与应用实践(三)MergeTree原理解析

1、MergeTree创建方式与存储结构

  • MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。

1.1 MergeTree创建

CREATE TABLE table_name (

) ENGINE = MergeTree()
[PARTITION BY xx]
[ORDER BY xx]
[PRIMARY KEY xx]
[SAMPLE BY xx]
[SETTINGS name=value]
  • ORDER BY 必填,在一个数据片段内,数据以何种标准排序。默认情况下,主键与排序键相同。
  • PRIMARY KEY 生成一级索引。可以直接用order by代为制定。
  • 默认情况下每间隔8192行数据生成一条索引。

1.2 存储结构

MergeTree存储结构
  • checksums 二进制校验文件,报错余下各文件的size和size哈希。
  • columns 保存列字段信息
  • count 保存数据总行数
  • primary 一级索引,稀疏索引
  • [Column].bin 数据文件
  • [Column].mrk 与索引对应,保存了bin中数据偏移量信息。首先通过primary.idx找到对应数据偏移量,然后再通过偏移量直接从.bin中读取数据。
  • [Column].mrk2 如果使用自适应大小的索引间隔,标记文件以mrk2命名,工作原理和.mrk一样。
  • skp_idx_[Column].idx skp_idx_[Column].mrk 如果声明了二级索引,额外会生成相应索引和标记文件。

2、数据分区

2.1 分区目录命名规则

分区命名
  • MinBlock maxBlock 最小最大数据块编号,计数在单张MergeTree数据表内全局累加。
  • Level合并层级,相同分区发生合并,则相应分区内计数累加1。

2.2 分区目录合并过程

分区合并
  • MeregeTree分区目录并不是在数据表被创建之后就存在的,而是在数据写入过程中被创建的。
  • 伴随着每一批数据的写入,MergeTree都会生成一批新的分区目录。

3、一级索引

3.1 索引粒度

  • 默认是8192


    索引粒度

3.2 索引数据生成

索引数据生成

3.3 索引查询

  • 一个具体的数据段是一个MarkRange,划分依据是间隔(默认8192)
  • 首先生成查询条件,然后递归交集判断。
索引查询过程

4、二级索引

  • granularity定义了一行跳数索引能跳过多少个index_granularity区间的数据。
  • 注意图中granularity和index_granularity间的关系。
二级索引

5、数据存储

5.1 各列独立存储

  • 数据是经过压缩的。
  • 事先按照order by声明排序。
  • 数据是以压缩数据块的形式被组织并写入.bin文件中的。

5.2 压缩数据块

  • .bin压缩文件是由多个压缩数据块组成的
压缩数据块示意图
切割压缩数据块

6、数据标记

  • 根据偏移读取对应的压缩数据块。12000 - 12016是因为有8位头文件。
  • 以index_granularity粒度加载特定的一小段
标记的对应关系
标记的样式
数据标记使用方法

7、协同总结

7.1 写入

写入过程

7.2 查询

查询过程

7.3 数据标记与压缩块对应关系

  • 多个标记对应一个压缩块、一个标记对应一个压缩块比较好理解。
  • 一个标记对应多个压缩块,说明这index_granualarity间隔的数据很大。
一对多

你可能感兴趣的:(Clickhouse原理与应用实践(三)MergeTree原理解析)