MergeTree 系列表引擎
MergeTree 有很多变种,常用的表引擎还有 ReplacingMergeTree、SummingMergeTree、AggregatingMergeTree、CollapsingMergeTree 和 VersionedCollapsingMergeTree。
数据TTL
    TTL (Time To Live)表示数据的存活时间。
(1) 列级别 TTL
    需要在定义表字段的时候,为它们声明了 TTL 表达式,主键字段不能被声明 TTL
CREATE TABLE ttl_table_v1 ( id String, create_time DateTime, code String TTL create_time + INTERVAL 10 SECOND, type UInt8 TTL create_time + INTERVAL 10 SECOND ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY id
表级别 TTL
CREATE TABLE ttl_table_v2 ( id String, create_time DateTime, code String TTL create_time + INTERVAL 1 MINUTE, type UInt8 ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY create_time TTL create_time + INTERVAL 1 DAY
建表的时候增加表级别的 TTL ,当触发 TTL 清理时,那些满足过期时间的数据行将被整行删除。TTL 支持修改,例如:
ALTER TABLE ttl_table_v2 MODIFY TTL create_time INTERVAL + 3 DAY
表级别的 TTL 不支持取消
ReplacingMergeTree
     MergeTree 拥有主键,但没有唯一约束,如果不希望数据表中有重复数据的场景可以使用 ReplacingMergeTree ,可以在合并分区时删除重复的数据。
ENGINE = ReplacingMergeTree(ver)
里面的参数 ver 是选填的,最常见的是使用 create_time 作为版本号,合并数据的时候取最新的时间去重
CREATE TABLE replace_table ( id String, code String, create_time DateTime ) ENGINE = ReplacingMergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (id, code) PRIMARY KEY id
   ORDER BY 是去除重复数据的关键,不是 PRIMARY KEY,ORDERR BY 声明的表达式是后续判断数据是否重复的依据,触发所有分区合并:
optimize TABLE table_name FINAL
(1) 使用 ORDER BY 排序键作为判断数据重复的唯一键; (2) 当导入同一分区目录时,会直接进行去重; (3) 当导入不同分区目录时,不会进行去重,只有当分区目录合并时,属于同一分区内的重复数据才会去重;但是不同分区内的重复数据不会被删除; (4) 在进行数据去重时,因为分区内的数据已经是基于 ORDER BY 排好序的,所以能很容易地找到那些相邻的重复的数据; (5) 数据去重策略有两种:如果没有设置 ver 版本号,则保留同一组重复数据中的最后一条;如果设置了 ver 版本号,则保留同一组重复数据中 ver 字段取值最大的那一行
SummingMergeTree
SummingMergeTree 能够在合并分区的时候按照预先定义的条件聚合汇总数据,将同一分组下的多行数据汇合并成一行,这样既减少了数据行,又降低了后续汇总查询的开销。主要使用的场景是用户只关心汇总结果,不关心明细数据,并且数据汇总条件是预先明确的场景(GROUP BY 条件明确,且不会随意改变)
ENGINE = SummingMergeTree((col1, col2, col3, ...))
col1、col2 为 columns 参数值,这是一个选填参数,用于设置除主键外的其它数值类型字段,以指定被 SUM 汇总的列字段。如果不填写此参数,则会将所有非主键的数值类型字段进行汇总,下面就来创建一张 SummingMergeTree 表:
CREATE TABLE summing_table ( id String, city String, v1 UInt32, v2 Float64, create_time DateTime ) ENGINE = SummingMergeTree() PARTITION BY toYYYYMM(create_time) PRIMARY KEY id ORDER BY (id, city)
如果导入同一分区目录的数据有重复的,那么直接就聚合了,不同分区目录则不会聚合,而是在合并生成新分区目录的时候,再对属于同一分区的多个分区目录里的数据进行聚合。另外 SummingMergeTree 也支持嵌套类型的字段,在使用嵌套类型字段时,需要被 SUM 汇总的字段必须以以 Map 后缀结尾
(1)只有 ORDER BY 排序键作为聚合数据的条件 Key (2)写入同一分区目录的数据会聚合之后在写入,而属于同一分区的不同分区目录的数据,则会在合并触发时进行汇总 (3)不同分区的数据不会汇总到一起 (4)如果在定义引擎时指定了 columns 汇总列(非主键的数值类型字段),则 SUM 会汇总这些列字段;如果未指定,则聚合所有非主键的数值类型字段 (5)在进行数据汇总时,因为分区内的数据已经基于 ORDER BY 进行排序,所以很容易找到相邻也拥有相同 Key 的数据 (6)在汇总数据时,同一分区内相同聚合 key 的多行数据会合并成一行,其中汇总字段会进行 SUM 计算;对于那些非汇总字段,则会使用第一行数据的取值 (7)支持嵌套结构,但列字段名称必须以 Map 后缀结尾,并且默认以第一个字段作为聚合 Key。并且除了第一个字段以外,任何名称以 key、Id 或者 Type 为后缀结尾的字段都会和第一个字段组成复合 Key
AggregatingMergeTree
AggregatingMergeTree 是 SummingMergeTree 升级版,核心思想是以空间换时间的方法提升查询性能。首先,它能够在合并分区的时候按照预先定义的条件聚合数据。同时,根据预先定义的聚合函数计算数据并通过二进制的格式存入表内。通过将同一分组下的多行数据预先聚合成一行,既减少了数据行,又降低了后续聚合查询的开销。
ENGINE = AggregatingMergeTree()
AggregatingMergeTree 没有任何额外的设置参数,在分区合并时,在每个数据分区内,会按照 ORDER BY 聚合。经常结合物化视图方式实现,首先创建底表:
CREATE TABLE agg_table_basic ( id String, city String, code String, value UInt32 ) ENGINE = MergeTree() PARTITION BY city ORDER BY (id, city)
通常使用 MergeTree 作为底表,用于存储全量的明细数据,并以此对外提供实时查询。接着,创建一张物化视图:
CREATE MATERIALIZED VIEW agg_view ENGINE = AggregatingMergeTree() PARTITION BY city ORDER BY (id, city) AS SELECT id, city, uniqState(code) AS code, sumState(value) AS value FROM agg_table_basic GROUP BY id, city
物化视图使用 AggregatingMergeTree 表引擎,用于特定场景的数据查询,相比 MergeTree,它拥有更高的性能。数据会自动同步到物化视图,并按照 AggregatingMergeTree 的引擎的规则进行处理,查询只对 agg_view 查询即可
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号