【列存引擎内核】MergeTree Part 文件格式

💡 原文中文,约18600字,阅读约需45分钟。
📝

内容提要

本文介绍了ClickHouse的MergeTree引擎及其数据单元Part的结构和功能。Part是不可变的目录,包含列文件和元数据,支持查询、合并和副本同步。文章详细阐述了Part的生命周期、目录结构、Granule和Mark的作用,以及如何通过设置优化性能。同时讨论了Wide与Compact格式的区别,以及Part的管理与维护。

🎯

关键要点

  • MergeTree 的数据单元是 Part,表示不可变目录,支持查询、合并和副本同步。

  • Part 目录结构包括多个文件,如 columns.txt、checksums.txt 和 primary.idx,分别用于存储列信息、校验和和主键索引。

  • Granule 是 ClickHouse SELECT 时最小的数据集,每个 granule 包含整数行,首行 PK 值写入索引。

  • Mark 文件将逻辑 granule 映射到列数据的字节位置,支持不同的布局格式,如 .mrk、.mrk2 和 .mrk3。

  • Wide 格式和 Compact 格式的区别在于数据存储方式,Wide 格式使用独立的列文件,而 Compact 格式将数据合并为更少的文件。

  • Part 的命名规则包括分区 ID、块号和级别,级别表示经历的合并次数。

  • Part 的管理与维护涉及到状态机,Part 可以处于 Temporary、PreActive、Active、Outdated 和删除状态。

  • 系统表 system.parts 提供了关于 Part 的元数据,包括名称、行数、磁盘字节数和级别等信息。

🔎

延伸解读

Part 的生命周期与状态管理

Part 在 ClickHouse 中的生命周期包括 Temporary、PreActive、Active、Outdated 和删除状态。理解这些状态有助于优化数据管理,确保系统在高并发情况下的稳定性。特别是在高频率插入时,合理管理 Part 的状态可以避免系统过载,提升查询性能。

Wide 与 Compact 格式的选择

Wide 格式和 Compact 格式在数据存储方式上存在显著差异。Wide 格式适合大数据量的场景,而 Compact 格式则在小数据量时表现更佳。选择合适的格式可以有效提升查询效率和存储利用率,尤其是在处理不同类型的查询时,需根据实际需求进行调整。

Granule 的作用与性能影响

Granule 是 ClickHouse 中最小的数据读取单元,影响查询性能。合理设置 index_granularity 和 index_granularity_bytes 可以优化 Granule 的大小,从而提高查询效率。特别是在处理大数据集时,Granule 的配置直接关系到系统的响应速度和资源消耗。

延伸问答

MergeTree的Part是什么?

MergeTree的Part是不可变的目录,包含列文件和元数据,支持查询、合并和副本同步。

Part的目录结构包含哪些文件?

Part的目录结构包括columns.txt、checksums.txt和primary.idx等文件,分别用于存储列信息、校验和和主键索引。

Granule在ClickHouse中有什么作用?

Granule是ClickHouse SELECT时最小的数据集,每个granule包含整数行,首行PK值写入索引。

Wide格式和Compact格式有什么区别?

Wide格式使用独立的列文件,而Compact格式将数据合并为更少的文件,适用于不同的存储需求。

如何管理和维护Part?

Part的管理与维护涉及状态机,Part可以处于Temporary、PreActive、Active、Outdated和删除状态。

system.parts表提供了哪些元数据?

system.parts表提供关于Part的元数据,包括名称、行数、磁盘字节数和级别等信息。

🏷️

标签

➡️

继续阅读