合并树家族 AggregatingMergeTree 该引擎继承自 MergeTree,并改变了数据片段的合并逻辑。ClickHouse 会将一个数据片段内所有具有相同主键(准确的说是 排序键)的行替换成一行,这一行会存储一系列聚合函数的状态。 该引擎的功能主要是做增量数据聚合统计,包过物化视图函数聚合。 下面我们看个使用例子:
create table test.test_aggremergetree (
id Int32 comment 'id',
name String comment '名称',
money AggregateFunction(sum, Decimal32(2)) COMMENT '工资',
create_at DateTime comment '创建时间'
) engine = AggregatingMergeTree()
order by
id partition by toYYYYMM(create_at) primary key id sample by id TTL create_at + INTERVAL 1 MONTH DELETE;
插入数据如下: 注意:需要使用INSERT…SELECT语句进行数据插入
insert into table test_aggremergetree select 1,'测试',sumState(toDecimal32(10333,2)),now();
insert into table test_aggremergetree select 1,'测试',sumState(toDecimal32(10,2)),now();
insert into table test_aggremergetree select 1,'测试',sumState(toDecimal32(10,2)),now();
查询数据结果如下:
select id,name,sumMerge(money) from test_aggremergetree group by id,name;
AggregatingMergeTree这个其主要功能其实是做物化视图,数据量太多了 可能针对于好几个条件聚合取sum的功能。
ReplacingMergeTree 该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。数据的去重只会在数据合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先作出计划。有一些数据可能仍未被处理。尽管你可以调用 OPTIMIZE 语句发起计划外的合并,但请不要依靠它,因为 OPTIMIZE 语句会引发对数据的大量读写。 一般这个引擎的使用都需要设置一个时间,为了避免数据没有及时清理,需要取数据的时候按照排序键取最近的时间的那条数据。
SummingMergeTree 该引擎继承自 MergeTree。区别在于,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。 这个引擎和听起来和AggregatingMergeTree差不多,但是使用方面明显不一样。 SummingMergeTree我们来看例子,他的聚合不需要使用聚合函数。 创建表:
CREATE TABLE test.test_summergetree
(
`id` Int32 COMMENT 'id',
`name` String COMMENT '名称',
`money` AggregateFunction(sum, Decimal32(2)) COMMENT '工资',
`create_at` DateTime COMMENT '创建时间'
)
ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(create_at)
PRIMARY KEY id
ORDER BY id
SAMPLE BY id
TTL create_at + toIntervalMonth(1)
插入数据:
insert into table test_summergetree select 1,'测试',100,now();
insert into table test_summergetree select 1,'测试',200,now();
insert into table test_summergetree select 1,'测试',400,now();
insert into table test_summergetree select 1,'测试222',400,now();
insert into table test_summergetree select 1,'测试222',600,now();
insert into table test_summergetree select 11,'测试222',600,now();
insert into table test_summergetree select 11,'测试222',800,now();
等了一会之后我们查询数据结果如下:
┌─id─┬─name─┬───money─┬───────────create_at─┐
│ 1 │ 测试 │ 1700.00 │ 2021-03-27 19:44:23 │
└────┴──────┴─────────┴─────────────────────┘
┌─id─┬─name────┬──money─┬───────────create_at─┐
│ 11 │ 测试222 │ 600.00 │ 2021-03-27 19:45:37 │
└────┴─────────┴────────┴─────────────────────┘
┌─id─┬─name────┬──money─┬───────────create_at─┐
│ 11 │ 测试222 │ 800.00 │ 2021-03-27 19:45:42 │
└────┴─────────┴────────┴─────────────────────┘
┌─id─┬─name────┬──money─┬───────────create_at─┐
│ 11 │ 测试222 │ 800.00 │ 2021-03-27 19:45:54 │
└────┴─────────┴────────┴─────────────────────┘
id为1的已经聚合成功了,但是id为11还没有聚合成功。 SummingMergeTree主要是用于主键聚合的计算。
数据副本 只有 MergeTree 系列里的表可支持副本:只有如下的引擎支持复制表。其实就是在对应的引擎前面加上Replicated即可。(我这里特殊说明一下,之前我们用复制表引擎,买了阿里云的clickhouse,结果插入数据会丢失,问了阿里云的人,他们说单副本不支持复制表引擎,这里可以说其实是他们自己服务搭建的架构有bug,因为这样的问题我们当时查了3天,才查出来这个原因。) ReplicatedMergeTree ReplicatedSummingMergeTree ReplicatedReplacingMergeTree ReplicatedAggregatingMergeTree ReplicatedCollapsingMergeTree ReplicatedVersionedCollapsingMergetree ReplicatedGraphiteMergeTree
日志引擎系列,这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。 StripeLog Log TinyLog
还有一些特殊引擎 URL:用于管理远程 HTTP/HTTPS 服务器上的数据 Memory:引擎以未压缩的形式将数据存储在 RAM 中 分布式引擎:本身不存储数据, 但可以在多个服务器上进行分布式查询。分布式表其实就是视图,主要是分布式集群用于查询多个节点的数据的。