Clickhouse笔记
概述
- 端口8123:tcp转发
- 端口9000:http转发
- 端口9009:interserverHTTPPort
- 列式存储:磁盘存储按列存储
- 多核并行:分区间并行处理数据(查询,合并等)
- 多种表引擎:常用MergeTree Family,Log Family,Integrations
- 写入建议:一批大于1000行,或每秒不超过一个写入请求
数据类型
- 整型:Int8、Int16、Int32、Int64;UInt8、UInt16、UInt32、UInt64
- 浮点型:Float32、Float64
- 布尔值:无该类型,用UInt8代替
- 字符串:String,FixedString(N)
- 时间类型:Date,Datetime,Datetime64
- LowCardinality: 对数据类型进行二次字典编码;修改底层数据存储
- 适用场景:原始数据冗长,去重后的计数值<1000
- 优点:降低磁盘存储空间,提高查询性能
- 缺点:写性能有所下降
- 参考
- https://blog.csdn.net/jiangshouzhuang/article/details/103268340
- https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/string_optimization.pdf
- https://blog.csdn.net/jiangshouzhuang/article/details/103268340
- 枚举:对比LowCardinality,枚举更加适合静态字典的场景
- 数组
- 不推荐多维数组
- 参考:https://clickhouse.com/docs/en/sql-reference/data-types/
目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
root@/data/clickhouse# tree -L 1
.
|-- data // 数据、表元数据
|-- format_schemas
|-- log // ck-server日志文件
`-- tmp
root@/data/clickhouse/data# tree -L 1
.
|-- data // 数据、索引文件
|-- dictionaries_lib
|-- flags
|-- metadata // 表元数据
|-- metadata_dropped
|-- preprocessed_configs
|-- status
`-- store // data下数据文件是以软连接到store目录
// 表partition
root@/data/clickhouse/data/data/{database}/{table}# tree -L 1
.
|-- 20220917_20_20_0 // patition
|-- 20220917_21_21_0
|-- detached // 记录损坏partition
`-- format_version.txt // version
// partition目录
root@/data/clickhouse/data/data/{database}/{table}/{patition}# tree -L 1
.
|-- checksums.txt // 校验文件
|-- columns.txt // 列信息(字段名、类型)
|-- count.txt // 总数
|-- data.bin // 数据
|-- data.mrk3 // 数据标记文件,索引文件会用到该标记
|-- default_compression_codec.txt // 压缩
|-- minmax_timestamp.idx // 分区minimal索引
|-- partition.dat // 分区信息
`-- primary.idx // 主键索引
partition命名规则
1
2
3
4
5
6
20220917_1_1_0
[分区名]-[最小分区块编号]-[最大分区块编号]-[合并数次]
分区名:跟partition by参数有关,有整数字符串、日期、哈希值
分区块编号:新生成的分区自增
合并数次:合并一次加1
表引擎
MergeTree
- 支持索引和分区
- partition by(optional):指定分区规则,一般是按时间
- primary key(optional):主键,只提供一级索引,没有唯一约束
- order by(required):分区内排序,主键必须是order by字段的前缀字段
- settings(optional):一些额外控制参数,如index_granularity索引粒度,默认8192
- TTL:支持列ttl,表级ttl
- 参考:https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree
ReplacingMergeTree
- 在MergeTree的基础上增加去重功能
- 入参为版本字段:如engine =ReplacingMergeTree(create_time)
- 根据order by字段进行去重,不能跨分区去重
- 在分区合并时才进行去重
- 参考:https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replacingmergetree
SummingMergeTree
- 入参为需要汇总的字段:如ENGINE = SummingMergeTree([columns])
- 以order by列为维度
- 同一分区才会做聚合处理
- 分区合并时进行聚合
- 参考:https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/summingmergetree
Distributed
- 分布式表:逻辑表,对该表进行操作时,会被路由到本地,然后汇总结果返回给用户
- 本地表:实际存储数据的表
- 常见分布式集群方案:
- MergeTree + Distributed
- MergeTree + Distributed+集群复制
- ReplicatedMergeTree + Distributed
- 参考
- https://zhuanlan.zhihu.com/p/161242274
- https://clickhouse.com/docs/en/engines/table-engines/special/distributed
- https://www.cnblogs.com/yisany/p/13524018.html
*MergeTree与Replicated*MergeTree区别
- *MergeTree数据同步依赖数据库同步机制,不依赖zookeeper
- Replicated*MergeTree依赖zookeeper
- 参考:https://juejin.cn/post/6875235444909408263
索引(MergeTree)
参考:https://sobriver.top/2021/07/07/%E7%BC%96%E7%A8%8B/clickhouse/clickhouse%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D/
主键索引
- 没有唯一约束
- 稀疏索引
- 由建表语句index_granularity指定索引粒度,默认8192
分区索引
- 记录分区下分区字段对应原始数据的最小和最大值
- 查询语句指定分区字段时,通过该索引快速定位到分区
跳数索引
- INDEX index_name expr TYPE type(…) GRANULARITY granularity_value,type:minmax, set, bloom_filter等
- minmax:指定一个值范围
- set(max_rows):保存表达式去重复后值,适用重复性高的字段
- bloom_filter([false_positive]):布隆过滤器,false_positive为误报率
- ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed):对String, FixedString 和 Map类型数据有效,可用于优化 EQUALS, LIKE 和 IN表达式。
- tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed):适用全文搜索
稀疏索引
- 分区数据已经按order by字段排序,在这个基础上再创建索引(二级索引)
参考
- 类型:https://clickhouse.com/docs/en/guides/improving-query-performance/skipping-indexes#skip-index-types
- 布隆过滤器参数计算:https://hur.st/bloomfilter/
- https://blog.csdn.net/haveanybody/article/details/123919938
explain
是否走索引
- explain indexes = 1
- https://www.modb.pro/db/161379
副本同步原理
- 1、client向某个server1发送写入请求
- 2、server1写入本地
- 3、同步operation log到zookeeper
- 4、其他server监听到operation log变化并拉取operation log
- 5、解析operation log,并从server1拉取数据
- 总结:
- 1、谁处理client请求,谁负责。负责同步operation log数据到zookeeper
- 2、zookeeper不参与实质的data数据传输,只负责log同步
分区操作
- 参考:https://clickhouse.com/docs/en/sql-reference/statements/alter/partition
数据压缩
- 数据类型存储:https://aop.pub/artical/database/clickhouse/datatype-storage/
- 压缩算法选型:https://blog.csdn.net/neweastsun/article/details/130974311;https://chistadata.com/compression-algorithms-and-codecs-in-clickhouse/
- 压缩算法:https://developer.aliyun.com/article/780586
总结
- clickhouse采用列式存储,适合OLAP场景
- 多种数据类型,不支持Bool,LowCardinality对数据类型进行二次编码
- 常用MergeTree序列表引擎,关键字段:partition by,primary key,order by,settings
- 索引:主键索引,分区索引,跳数索引
- 常用分区操作
参考
- 官方文档:https://clickhouse.com/docs/en/intro
- https://blog.csdn.net/qq_40378034/article/details/120256757
- BitMap及其在ClickHouse中的应用:https://zhuanlan.zhihu.com/p/480345952
This post is licensed under CC BY 4.0 by the author.