clickhouse MergeTree 写入与查询
所属分类 clickhouse
浏览量 445
分区 索引 数据存储
数据标记 压缩数据块
分区
数据是以分区目录的形式进行组织,每个分区独立存储,数据查询时可以有效跳过无用的数据文件,只使用最小的分区目录子集
一级索引使用二进制格式存储,用于存储稀疏索引,一张 MergeTree 表只能通过 ORDER BY 或 PRIMARY KEY声明一次一级索引。
借助稀疏索引,减少数据扫描范围,加速查询速度
二级索引又称为跳数索引,由数据的聚合信息构建而成,根据索引类型的不同,其聚合信息的内容也不同
数据bin文件由1至多个压缩数据块组成的,每个压缩块大小在64KB~1MB之间,
多个压缩数据块之间,按照写入顺序首尾相接,紧密地排列在一起;
数据标记使用二进制格式存储,标记文件中保存了 data.bin 文件中数据的偏移量信息,并且标记文件与稀疏索引对齐,
通过标记文件建立 稀疏索引(primary.idx)与 数据文件(data.bin)之间的映射关系。
读取数据时,首先通过稀疏索引(primary.idx)找到对应数据的偏移量信息(data.mrk),
根据偏移量信息直接从 data.bin 文件中读取数据
写入流程
数据写入的第一步是生成分区目录,伴随着每一批数据的写入,都会生成一个新的分区目录,
在后续的某一时刻,属于相同分区的分区目录会被合并到一起
按照index_granularity索引粒度,分别生成 primary.idx 一级索引
如果声明了二级索引,还会创建二级索引文件
按照index_granularity索引粒度,生成每一个列字段的压缩数据文件(.bin)和 数据标记文件(.mrk)
如果数据量不大,则是 data.bin 和 data.mrk 文件
查询流程
数据查询,可以看作一个不断减小数据范围的过程。
理想情况,依次借助分区索引、一级索引和二级索引,将数据 扫描范围缩至最小
然后再借助数据标记,将需要解压与计算的数据范围缩至最小
如果一条查询语句没有指定任何 WHERE 条件,或者指定了 WHERE 条件 , 但是没有匹配到任何的索引(分区索引、一级索引、二级索引),
那就不能预先减少数据范围 , 会扫描所有分区目录,以及目录内索引段的最大区间
不过虽然不能减少数据范围,但能借助数据标记,以多线程的形式同时读取多个压缩数据块,以提升性能
上一篇
下一篇
《资本论》笔记
大萧条的一些特点
clickhouse ReplacingMergeTree
clickhouse MergeTree 存储结构
clickhouse核心知识点
OLAP和OLTP的本质区别