clickhouse 相对于mysql,除了在mysql在SQL和索引的优化空间比较大外,而其他的clickhouse的优化空间还是很大的,对于clickhouse他的服务端配置参数对于任务的影响还是很大的。现在我们来看看clickhouse都有哪些常规的优化点,今天主要学习一下创建表的时候需要注意的点
SELECT
查询效率不佳。我们先搞清楚,clickhouse的索引是如何存储的,当数据被插入到表中时,会创建多个数据片段并按主键的字典序排序。例如,主键是 (CounterID, Date)
时,片段中数据首先按 CounterID
排序,具有相同 CounterID
的部分按 Date
排序。下图也就是他的排序规则(稀疏索引)
不同分区的数据会被分成不同的片段,ClickHouse 在后台合并数据片段以便更高效存储。不同分区的数据片段不会进行合并。合并机制并不保证具有相同主键的行全都合并到同一个数据片段中。
数据片段可以以 Wide
或 Compact
格式存储。在 Wide
格式下,每一列都会在文件系统中存储为单独的文件,在 Compact
格式下所有列都存储在一个文件中。Compact
格式可以提高插入量少插入频率频繁时的性能。
数据存储格式由 min_bytes_for_wide_part
和 min_rows_for_wide_part
表引擎参数控制。如果数据片段中的字节数或行数少于相应的设置值,数据片段会以 Compact
格式存储,否则会以 Wide
格式存储。
每个数据片段被逻辑的分割成颗粒(granules)。颗粒是 ClickHouse 中进行数据查询时的最小不可分割数据集。ClickHouse 不会对行或值进行拆分,所以每个颗粒总是包含整数个行。每个颗粒的第一行通过该行的主键值进行标记,ClickHouse 会为每个数据片段创建一个索引文件来存储这些标记。对于每列,无论它是否包含在主键当中,ClickHouse 都会存储类似标记。这些标记让您可以在列文件中直接找到数据。
颗粒的大小通过表引擎参数 index_granularity
和 index_granularity_bytes
控制。颗粒的行数的在 [1, index_granularity]
范围中,这取决于行的大小。如果单行的大小超过了 index_granularity_bytes
设置的值,那么一个颗粒的大小会超过 index_granularity_bytes
。在这种情况下,颗粒的大小等于该行的大小。
我们已经知道索引是如何存储的了,那我们就可以试着优化一下