列存储
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