前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解clickhouse的MergeTree引擎存储结构

详解clickhouse的MergeTree引擎存储结构

作者头像
公众号-利志分享
发布2022-04-25 09:35:11
7500
发布2022-04-25 09:35:11
举报
文章被收录于专栏:利志分享

按照我之前的文档,默认安装的clickhouse路径在:

代码语言:javascript
复制
<path>/var/lib/clickhouse/</path>

MergeTree表引擎中的数据是拥有物理存储的,数据会按照分区目录的形式保存到磁盘之上,其完整的存储结构如图:

代码语言:javascript
复制
tableName
    |-- 202203_1_39921_1006
    |   |-- checksums.txt
    |   |-- columns.txt
    |   |-- count.txt
    |   |-- default_compression_codec.txt
    |   |-- event_date.bin
    |   |-- event_date.mrk2
    |   |-- event_time.bin
    |   |-- event_time_microseconds.bin
    |   |-- event_time_microseconds.mrk2
    |   |-- event_time.mrk2
    |   |-- metric.bin
    |   |-- metric.dict.bin
    |   |-- metric.dict.mrk2
    |   |-- metric.mrk2
    |   |-- minmax_event_date.idx
    |   |-- partition.dat
    |   |-- primary.idx
    |   |-- value.bin
    |   `-- value.mrk2
    |-- 202203_39922_86235_989
    |   |-- checksums.txt
    |   |-- columns.txt
    |   |-- count.txt
    |   |-- default_compression_codec.txt
    |   |-- event_date.bin
    |   |-- event_date.mrk2
    |   |-- event_time.bin
    |   |-- event_time_microseconds.bin
    |   |-- event_time_microseconds.mrk2
    |   |-- event_time.mrk2
    |   |-- metric.bin
    |   |-- metric.dict.bin
    |   |-- metric.dict.mrk2
    |   |-- metric.mrk2
    |   |-- minmax_event_date.idx
    |   |-- partition.dat
    |   |-- primary.idx
    |   |-- value.bin
    |   `-- value.mrk2

一张数据表的完整物理结构分为3个层级,依次是数据表目录、分区目录及各分区下具体的数据文件。接下来就逐一介绍它们的作用。

(1)partition:分区目录,余下各类数据文件(primary.idx、[Column].mrk、[Column].bin等)都是以分区目录的形式被组织存放的,属于相同分区的数据,最终会被合并到同一个分区目录,而不同分区的数据,永远不会被合并在一起。

(2)checksums.txt:校验文件,使用二进制格式存储。它保存了余下各类文件(primary.idx、count.txt等)的size大小及size的哈希值,用于快速校验文件的完整性和正确性。

(3)columns.txt:列信息文件,使用明文格式存储。用于保存此数据分区下的列字段信息,如下图:

代码语言:javascript
复制
columns format version: 1
5 columns:
`event_date` Date
`event_time` DateTime
`event_time_microseconds` DateTime64(6)
`metric` LowCardinality(String)
`value` Float64

(4)count.txt:计数文件,使用明文格式存储。用于记录当前数据分区目录下数据的总行数,如下图:

代码语言:javascript
复制
cat count.txt 
1148

(5)primary.idx:一级索引文件,使用二进制格式存储。用于存放稀疏索引,一张MergeTree表只能声明一次一级索引(通过ORDER BY或者PRIMARY KEY)。借助稀疏索引,在数据查询的时能够排除主键条件范围之外的数据文件,从而有效减少数据扫描范围,加速查询速度。

(6)[Column].bin:数据文件,使用压缩格式存储,默认为LZ4压缩格式,用于存储某一列的数据。由于MergeTree采用列式存储,所以每一个列字段都拥有独立的.bin数据文件,并以列字段名称命名(例如CounterID.bin、EventDate.bin等)。

(7)[Column].mrk:列字段标记文件,使用二进制格式存储。标记文件中保存了.bin文件中数据的偏移量信息。标记文件与稀疏索引对齐,又与.bin文件一一对应,所以MergeTree通过标记文件建立了primary.idx稀疏索引与.bin数据文件之间的映射关系。即首先通过稀疏索引(primary.idx)找到对应数据的偏移量信息(.mrk),再通过偏移量直接从.bin文件中读取数据。由于.mrk标记文件与.bin文件一一对应,所以MergeTree中的每个列字段都会拥有与其对应的.mrk标记文件(例如CounterID.mrk、EventDate.mrk等)。

(8)[Column].mrk2:如果使用了自适应大小的索引间隔,则标记文件会以.mrk2命名。它的工作原理和作用与.mrk标记文件相同。

(9)partition.dat与minmax_[Column].idx:如果使用了分区键,例如PARTITION BY EventTime,则会额外生成partition.dat与minmax索引文件,它们均使用二进制格式存储。partition.dat用于保存当前分区下分区表达式最终生成的值;而minmax索引用于记录当前分区下分区字段对应原始数据的最小和最大值。例如EventTime字段对应的原始数据为2019-05-01、2019-05-05,分区表达式为PARTITION BY toYYYYMM(EventTime)。partition.dat中保存的值将会是2019-05,而minmax索引中保存的值将会是2019-05-012019-05-05。

(10)skp_idx_[Column].idx与skp_idx_[Column].mrk:如果在建表语句中声明了二级索引,则会额外生成相应的二级索引与标记文件,它们同样也使用二进制存储。二级索引在ClickHouse中又称跳数索引,目前拥有minmax、set、ngrambf_v1和tokenbf_v1四种类型。这些索引的最终目标与一级稀疏索引相同,都是为了进一步减少所需扫描的数据范围,以加速整个查询过程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档