clickhouse partition 设定分区
clichouse会对数据分区存放,可以提高效率,便于维护磁盘空间。
clickhouse不建议按照条件查询使用delete删除数据。
clickhouse提供了ttl,可以设定数据的生命周期,到了时间,会自动删除数据。
如需维护磁盘使用,clickhouse提供了操作分区的功能。
设定数据库表分区
以官方示例为例
CREATE TABLE visits
(
VisitDate Date,
Hour UInt8,
ClientID UUID
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(VisitDate)
ORDER BY Hour;
创建一个表,定义partition根据toYYYYMM(VisitDate)分区,VisitDateshi是时间toYYYYMM(VisitDate)是把时间转成年月,所以这个表就会根据月分区。
同样也可以根据自己需要设定分区
ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/name', 'replica1', Sign)
PARTITION BY (toMonday(StartDate), EventType)
ORDER BY (CounterID, StartDate, intHash32(UserID));
注意,设定partition的规则颗粒度不要太细,如果分区太多(超过1000),会影响性能。
可以从系统表获取分区信息
SELECT * FROM system.parts
┌─partition─┬─name───────────────────┬─active─┐
|20231215 |20231215_1_8510_14 |1 |
|20231215 |20231215_8511_14172_11 |1 |
|20231215 |20231215_14173_15784_10 |1 |
|20231215 |20231215_15785_17648_10 |1 |
|20231215 |20231215_17649_17838_8 |0 |
└───────────┴────────────────────────┴────────┘
partition是分区id,相同的id的数据会放到一起,如果有多个,说明还处于分区周期没有完全合并,或者说数据量太大需要多个片段保存。
20231215_1_8510_14
- 20231215是分区的id
- 1是当前分区的第一个数据块的编号
- 8510是当前分片的最后一个数据块编号,所以下一个片段就是从8511开始
- 14 the mutation version (if a part mutated) 大体应该是该分片变化的版本号,因为数据不断插入,clickhouse一直在更新合并
分区还有一些其他作用,比如数据库表中有表示省份的字段,可以用该字段进行分区,把每个省的数据放一起,或者可以对数据进行哈希计算,把数据平均的放到不同的分区中。
分区的操作
分区的操作都是基于某个表的,虽然所有的表,使用相同的分区规则,会有相同的分区id,但是可以通过select database,table,partition,name, bytes_on_disk,path from system.parts where partition='20240111'
增加path路径查看,可以看到不同表的数据存放在不同目录下,还是以表为单位进行维护的。
删除
ALTER TABLE tcp DROP PARTITION 20240117
删除tcp表的20240117的分区
删除后再从system.parts
搜索,有可能数据还是存在的,但是占用磁盘空间少了,变成了13,说明删除成功。
过一会之后clickhouse会把分区完全删除,无法再搜到。
复制
ALTER TABLE tcp1 REPLACE PARTITION 20240117 FROM tcp2
把tcp2的数据复制到tcp1
卸载/装载
ALTER TABLE tcp DETACH PARTITION 20240117
卸载后的数据还是在磁盘上的,但是clickhouse不再维护,从clickhouse也搜索不到相关数据。主要用作迁移备份维护。
卸载后的数据会被移动到detached目录下
ALTER TABLE tcp ATTACH PARTITION 20240117
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key
https://clickhouse.com/docs/en/sql-reference/statements/alter/partition