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间隔的数据很大。
网友评论