ClickHouse MergeTree引擎底层存储结构是怎样的?
请详细描述ClickHouse MergeTree家族引擎的底层存储结构,包括数据分区(Partition)、数据部分(Data Part)、跳数索引(Skip Index)、列存文件组织以及合并(Merge)机制的工作原理。
回答
孤独的心
MergeTree底层存储结构:
-
分区(Partition):按PARTITION BY表达式将数据划分为不同目录,每个分区目录形如
2025-05_1_1_0。 -
Data Part:每次INSERT生成一个Data Part目录,内部包含:
primary.idx:主键索引(稀疏索引,每8192行记录一行)[column].bin:每列的压缩数据文件[column].mrk:列数据对应的标记文件(记录.bin中的偏移量)checksums.txt:校验和文件columns.txt:列元信息
-
跳数索引(Skip Index):可对每N个粒度块建立minmax/set/bloom_filter索引,存储在
skp_idx_[name].idx和skp_idx_[name].mrk中,用于跳过不必要的数据扫描。 -
合并(Merge):后台线程将多个小Part合并为大Part,合并时重新排序并重建索引。合并是MergeTree的核心机制,控制分区内Part数量以提升查询性能。
-
列存:每列独立存储,按Block(8192行)压缩,支持LZ4/ZSTD,极致压缩比和扫描性能。