概述

本文介绍了在PolarDB MySQL中过期数据清理(TTL)功能的实现原理。

问题现象

Time to Live (TTL) 功能常见于NoSQL数据库和基于LSM Tree的存储引擎中,提供了键(KEY)和行(Row)级别的生命周期控制策略。这一功能在某些场景下可以有效节省存储空间。在键值存储中,可以借助后台线程定期扫描过期的键并将其删除,而在基于LSM Tree的数据库中,可借助压缩(Compact)线程,定期清理过期的数据行。

示例

在传统的关系型数据库中(如 MySQL、OraclePostgreSQL)原生数据库并没有支持TTL功能,通常依赖于触发器或存储过程来实现类似的功能。

-- 1. 首先创建一个包含过期时间的表,表结构如下:
CREATE TABLE messages(
    message_id   VARCHAR(36) PRIMARY KEY,
    sender_id    VARCHAR(36),
    receiver_id  VARCHAR(36),
    message_text TEXT,
    sent_at      TIMESTAMP
);

-- 2. 创建一个定时任务,每隔5min(可自定义)运行一次任务,根据sent_at字段,删除那些已经过期的数据行
SET GLOBAL event_scheduler = ON;

CREATE EVENT delete_old_messages
ON SCHEDULE
  EVERY 5 MINUTE
STARTS CURRENT_TIMESTAMP
DO
DELETE FROM messages
WHERE sent_at < DATE_SUB(NOW(), INTERVAL 5 MINUTE);

但是,这种做法可能会引发其他问题,例如:

  • 如果删除不及时,仍可能查询到已经过期的数据行。

  • 如果需要删除的数据量较大,可能会导致数据库性能波动。

因此,如果我们需要更精细的TTL控制,仍然需要数据库原生支持TTL功能。

版本限制

PolarDB MySQL适用的数据库引擎版本如下:

  • MySQL 8.0.1且小版本需为8.0.1.1.49.2及以上版本。

  • MySQL 8.0.2且小版本需为8.0.2.2.29.2及以上版本。

如何查看内核版本,请参见内核版本说明