包虫病

注册

 

发新话题 回复该主题

ClickHouse数据目录完全解析 [复制链接]

1#
北京专门治疗白癜风医院 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/

之前文章有介绍过基础的MergeTree的物理存储结构,数据会按分区目录的形式保存到磁盘。本文着重介绍一些二进制文件的格式及内容。

首先按照如下规则创建表,用于后续数据的对照查询

#创建表CREATETABLEdefault.ansel(`a`Int32,`b`Int32,`c`Int32,INDEX`idx_c`(c)TYPEminmaxGRANULARITY1)ENGINE=MergeTreePARTITIONBYaORDERBYbSETTINGSindex_granularity=3,index_granularity_bytes=0;#插入测试数据insertintodefault.ansel(a,b,c)values(3,10,4),(3,9,5),(3,8,6),(3,7,7),(3,6,8),(3,5,9),(3,4,10);注意:设置index_granularity_bytes=0取消自适应索引粒度,便于后续观察mrk文件结构。插入后看一下测试数据如下:生成的数据文件如下:

[clickhouse

localhost/var/lib/clickhouse/data/default/ansel]tree├──3_1_1_0│├──a.bin│├──a.mrk│├──b.bin│├──b.mrk│├──c.bin│├──checksums.txt│├──c.mrk│├──columns.txt│├──count.txt│├──minmax_a.idx│├──partition.dat│├──primary.idx│├──skp_idx_idx_c.idx│└──skp_idx_idx_c.mrk├──detached└──format_version.txt一般的数据目录结构如下:

table_name#表名├─partition_{index}DIR#分区目录││#基础文件│├─checksums.txtBIN#各类文件的尺寸以及尺寸的散列│├─columns.txtTXT#列信息│├─count.txtTXT#当前分区目录下数据总行数│├─primary.idxBIN#稀疏索引文件│├─{column}.binBIN#经压缩的列数据文件,以字段名命名│├─{column}.mrkBIN#列字段标记文件│├─{column}.mrk2BIN#使用自适应索引间隔的标记文件││││#分区键文件│├─partition.datBIN#当前分区表达式最终值│├─minmax_{column}.idxBIN#当前分区字段对应原始数据的最值││││#跳数索引文件│├─skp_idx_{column}.idxBIN#跳数索引文件│└─skp_idx_{column}.mrkBIN#跳数索引表及文件│└─partition_{index}DIR#分区目录columns.txt列信息文件,使用文本文件存储,用于保存分区下的列字段信息。记录了有多少个字段,及字段名字和类型。

count.txt

计数文件,文本文件存储,用于记录当前数据分区目录下数据的总行数。记录了该part中row的数量。

primary.idx

一级索引文件,使用二进制格式存储。主键索引,根据index_granularity索引粒度,每index_granularity行取一个主键列的值组合起来作为索引,例子中并没有设置PRIMARYKEY,clickhouse在这种情况下默认将ORDERBY的字段默认作为PRIMARYKEY,所以这里的primary.idx是根据b字段的数据进行固定间隔抽取的。例子中index_granularity=3,所以primary.idx中存的是4、7、10。

{column}.mrk

列字段标记,使用二进制格式存储。标记文件中保存了bin文件中数据的偏移量信息,mrk文件与稀疏文件对齐,又与bin文件一一对应,所以MergeTree通过标记文件建立了primary.idx稀疏索引与bin数据文件的映射关系

以b.mrk为例

mrk文件分为两列,第一个值对应bin文件中压缩后数据块的偏移量,第二个值对应bin文件解压后数据块的偏移量,单位均为字节。Int32为4字节,索引粒度为3,所以数据块的偏移量是0、12、24。直观点可以表示成下面规则:所以primary.idx和mrk的行是一一对应。

{column}.bin

数据文件,使用压缩格式存储,默认使用LZ4压缩格式,用于存储某一列的数据。

以b.bin为例

一个压缩数据块由头信息和压缩数据两部分组成。头信息固定使用9位字节表示,具体由1个UInt8(1字节)和2个UInt32(4字节)整型组成,分别代表了使用的压缩算法类型、压缩后的数据大小和压缩前的数据大小。

Checksum:该bin文件的校验值,16字节。Block:数据块,包含Head和CompressedData。Head:包含CompressionMethod、CompressedSize、Un
分享 转发
TOP
发新话题 回复该主题