大数据ClickHouse进阶(三):TTL深入了解

举报
Lansonli 发表于 2022/09/15 08:00:10 2022/09/15
【摘要】 ​TTL深入了解TTL即Time To Live ,表示数据存活的时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这列的数据;如果是表级别的TTL,则会删除整张表的数据;如果同时设置了列级别和表级别的TTL,则会以先到期的那个为主。无论是列级别还是表级别的TTL,都需要依托某个DataTime或Date类型的字段,通过对这个时...

​TTL深入了解

TTL即Time To Live ,表示数据存活的时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这列的数据;如果是表级别的TTL,则会删除整张表的数据;如果同时设置了列级别和表级别的TTL,则会以先到期的那个为主。

无论是列级别还是表级别的TTL,都需要依托某个DataTime或Date类型的字段,通过对这个时间字段的INTERVAL操作,来描述TTL的过期时间,例如:

TTL time_col + INTERVAL 3 DAY


上述语句表示数据的存活时间是time_col时间的3天之后。

TTL time_col + INTERVAL 1 MONTH


上述语句表示数据的存活时间是time_col时间的1个月之后。

INTERVAL 完整的操作包括:SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER、YEAR。

一、列级别TTL

如果想要设置列级别的TTL,在声明表字段的时候,为他们声明TTL表达式,主键字段不能被声明TTL,举例如下:

#创建表t_mt2,指定gender 存活时间
node1 :) CREATE TABLE t_mt2(
id UInt8,
name String,
age UInt8 ,
gender String  TTL create_time+INTERVAL 10 SECOND,
create_time DateTime
)engine=MergeTree
order by id;

注意:以上gender字段的存活时间为create_time取值基础上向后延续10秒,此ttl实现借助create_time时间字段。

#向表t_mt2中插入如下数据
node1 :) insert into t_mt2 values (1,'zs',18,'f',now());

注意:当经过10s后,正常我们可以执行optimize table t_mt2 final语句直接查看表中结果,发现列gender下的数据变成string类型的空。但是此ClickHouse版本有bug,需要重启ClickHouse后,再执行optimize table t_mt2 final语句,才能看到效果。经测试,在之前版本没有此问题。

#重启ClickHouse后,执行如下语句查看对应表中的数据
node1 :) optimize table t_mt2 final;
node1 :) select * from t_mt2;


如果想要修改列字段对的TTL,或是为已有字段添加TTL,则可以使用ALTER语句,如下:

ALTER TABLE tbl MODIFY COLUMN col type TTL col_time + INTERVAL 1 DAY


举例如下:

#给表 t_mt2中的age列,指定ttl过期时间为 5s
node1 :) alter table t_mt2 modify column age UInt8 ttl create_time+interval 5 second;

#查看t_mt2 建表语句,age列ttl 生效
node1 :) show create table t_mt2;


二、表级别TTL

在ClickHouse中我们还可以对整张表设置TTL,需要在建表时在表参数中指定TTL表达式,当TTL触发时,满足过期时间的数据行将被整行删除。

举例:

#创建表t_mt3,表级别指定TTL ,数据10s过期
CREATE TABLE t_mt3(
id UInt8,
name String,
age UInt8 ,
gender String,
create_time DateTime
)engine=MergeTree
order by id
TTL create_time+INTERVAL 10 SECOND;

#向表t_mt3中插入如下数据
node1 :) insert into t_mt3 values (1,'zs',18,'f',now());

#经过10s,执行optimize table t_mt3 final,再次查看表中数据被删除清空
node1 :) optimize table t_mt3 final;


我们也可以对表级别TTL进行修改,修改方法如下:

ALTER TABLE tbl MODIFY TTL create_time +INTERVAL 3 DAY


举例如下:

#修改表t_mt3 数据过期时间为1分钟
node1 :) alter table t_mt3 modify ttl create_time + interval 1 minute;

#查看t_mt3表的TTL
node1 :) show create table t_mt3;


#向表t_mt3中插入如下数据
node1 :) insert into t_mt3 values (1,'zs',18,'f',now());

#经过1分钟 执行optimize table t_mt3 final,数据被清空
node1 :) optimize table t_mt3 final;


注意:无论是列级别TTL,还是表级别TTL,一旦设置后,目前没有取消的方法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。