CodeWalk

ClickHouse MergeTree引擎底层存储结构是怎样的?

作者:孤独的心 · 2026-05-30 12:55

请详细描述ClickHouse MergeTree家族引擎的底层存储结构,包括数据分区(Partition)、数据部分(Data Part)、跳数索引(Skip Index)、列存文件组织以及合并(Merge)机制的工作原理。

回答

孤独的心

MergeTree底层存储结构:

  1. 分区(Partition):按PARTITION BY表达式将数据划分为不同目录,每个分区目录形如 2025-05_1_1_0

  2. Data Part:每次INSERT生成一个Data Part目录,内部包含:

    • primary.idx:主键索引(稀疏索引,每8192行记录一行)
    • [column].bin:每列的压缩数据文件
    • [column].mrk:列数据对应的标记文件(记录.bin中的偏移量)
    • checksums.txt:校验和文件
    • columns.txt:列元信息
  3. 跳数索引(Skip Index):可对每N个粒度块建立minmax/set/bloom_filter索引,存储在skp_idx_[name].idxskp_idx_[name].mrk中,用于跳过不必要的数据扫描。

  4. 合并(Merge):后台线程将多个小Part合并为大Part,合并时重新排序并重建索引。合并是MergeTree的核心机制,控制分区内Part数量以提升查询性能。

  5. 列存:每列独立存储,按Block(8192行)压缩,支持LZ4/ZSTD,极致压缩比和扫描性能。