列存储

https://clickhouse.com/docs/knowledgebase/key-value

ch的列存储,每一列是独立的文件存储,select * from test where k = 1 limit 10的查询,如果k是order by的列,那么查找会很快速的定位到文件,然后文件内查找定位到行,然后就得到所在文件的行数,之后再去找其他所有列对应的文件,然后读取对应行的数据,组合起来,才能得到这一行的数据。

  • index_granularity 每一个块存储的最大行数,默认8192
  • index_granularity_bytes 每一个块存储的最大字节数,默认10MB

PARTITION BY

不推荐将 partition key设置的过细, Partitioning 并不会加速查询,order by会。

https://clickhouse.com/docs/en/optimize/partitioning-key 如果设置了partition key, 有数据插入时,clickhouse会检查key,然后写入到不同的partition中。因此如果partition key过细,回导致写入压力过大。

https://github.com/ClickHouse/ClickHouse/issues/20188 这个问题里,每天2~8B个插入,依然建议用月做partition key。

https://stackoverflow.com/questions/75439190/what-is-the-actual-use-of-partitions-in-clickhouse 建议partition数目小于100,1000个也可以工作,但是会加重文件系统负担,增大索引、内存使用。尽量保证高频的查询落在一个partition上。

https://stackoverflow.com/questions/68716267/is-it-possible-to-change-a-table-engine-of-an-existed-clickhouse-table/68716746#68716746 partition by / order by是无法修改的。

cloudflare using ch

https://blog.cloudflare.com/log-analytics-using-clickhouse cloudflare 使用ch存储nginx错误日志

  • 针对不同的列指定压缩算法,默认LZ4,可选LowCardinality,Gorilla
  • 批量插入,单次插入量要足够大
  • 使用分布式表
  • 过多的主键会影响插入性能
  • cloudflare使用数据采样的方式,入多个表,来减轻分析压力

集群配置

https://stackoverflow.com/questions/75008231/clickhouse-shows-duplicates-data-in-distributed-table

https://altinity.com/blog/2018-5-10-circular-replication-cluster-topology-in-clickhouse

SELECT * FROM system.clusters