clickhouse数据存储
表由按主键排序的数据部分组成
1.将数据插入表中时,会创建单独的数据部分,并且每个部分都按主键按字典顺序排序。例如,如果主键是(CounterID, Date)
,则部分中的数据按 排序CounterID
,每个中的数据按CounterID
排序Date
。
2.属于不同分区的数据被分成不同的部分。ClickHouse 在后台合并数据部分以提高存储效率。属于不同分区的部分不会合并。合并机制不保证具有相同主键的所有行都在同一个数据部分中。
3.数据部分可以存储Wide
或Compact
格式化。在Wide
格式中,每一列都存储在文件系统中的单独文件中,在Compact
格式中,所有列都存储在一个文件中。Compact
格式可用于提高小而频繁插入的性能。
4.数据存储格式由表引擎的min_bytes_for_wide_part
和设置控制。min_rows_for_wide_part
如果数据部分中的字节数或行数少于相应设置的值,则该部分以Compact
格式存储。否则以Wide
格式存储。如果未设置这些设置,则数据部分以Wide
格式存储。
5.每个数据部分在逻辑上被划分为颗粒。颗粒是 ClickHouse 在选择数据时读取的最小的不可分割数据集。ClickHouse 不会拆分行或值,因此每个颗粒始终包含整数行。颗粒的第一行标有该行的主键值。对于每个数据部分,ClickHouse 创建一个存储标记的索引文件。对于每一列,无论是否在主键中,ClickHouse 也存储相同的标记。这些标记让您可以直接在列文件中查找数据。粒度大小受表引擎的index_granularity
和设置限制。index_granularity_bytes
颗粒中的行数位于[1, index_granularity]
范围内,具体取决于行的大小。index_granularity_bytes
如果单行的大小大于设置的值,则颗粒的大小可能会超出。在这种情况下,颗粒的大小等于行的大小。