美文网首页
Clickhouse原理与应用实践(三)MergeTree原理解

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

作者: kaiker | 来源:发表于2022-08-06 10:51 被阅读0次

    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原理解

          本文链接:https://www.haomeiwen.com/subject/ipxvwrtx.html