ClickHouse 使用TTL

高併發發表於2020-12-22

什麼是TTL?

TTL的意思是Time To Live表示資料的存活時間。由於資料的價值會根據儲存的時間成反比,出於儲存成本的考慮通常只會保留近一年的資料。而在MergeTree (合併樹)引擎中,可以通過設定TTL來輕鬆管理資料的存活時間,使資料的價值最大化。

在ClickHouse 中,TTL可以設定值的生命週期,它既可以為整張表設定,也可以為每個列欄位單獨設定。表級別的 TTL 還會指定資料在磁碟和捲上自動轉移的邏輯。TTL 表示式的計算結果必須是 日期(date) 或 日期時間(datetime),如果同時設定了列級別的和表級別的TTL則以先到期的為準。

欄位級別TTL

當列欄位中的值過期時, ClickHouse會將它們替換成資料型別的預設值。如果分割槽內,某一列的所有值均已過期,ClickHouse會從檔案系統中刪除此列。ClickHouse的INTERVAL(資料時間間隔)支援的操作有:second,minute,hour,day,week,month(月),quarter(季度),year(年)。

示例:

# 建立時指定 TTL
CREATE TABLE example_table
(
    d DateTime,
    a Int TTL d + INTERVAL 1 day,
    b Int TTL d + INTERVAL 1 day,
    c String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d;
# 為表中已存在的列欄位新增 TTL
ALTER TABLE example_table
    MODIFY COLUMN `c` String TTL d + toIntervalDay(1)
# 修改列欄位的 TTL
ALTER TABLE example_table
    MODIFY COLUMN
    c String TTL d + INTERVAL 1 WEEK;

表級別TTL

表可以設定一個用於移除過期行的表示式,以及多個用於在磁碟或捲上自動轉移資料片段的表示式。當表中的行過期時,ClickHouse 會刪除所有對應的行。

示例:

# 建立時指定 TTL
CREATE TABLE example_table
(
    d DateTime,
    a Int
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH [DELETE],
    d + INTERVAL 1 WEEK TO VOLUME 'aaa',
    d + INTERVAL 2 WEEK TO DISK 'bbb';
# 修改表的 TTL
ALTER TABLE example_table
    MODIFY TTL d + INTERVAL 1 DAY;

參考文章:clickhouse官方文件

相關文章