【问题标题】:How do I clear old entries from a MySQL database table?如何从 MySQL 数据库表中清除旧条目?
【发布时间】:2017-01-10 21:43:20
【问题描述】:
我有一个 MySQL 数据库,里面有一张大表。一段时间后,它变得太满并且性能下降。每个星期天,我都想删除最后一次更新早于特定天数的行。
我该怎么做?
【问题讨论】:
标签:
mysql
sql
database
triggers
【解决方案1】:
制作一个预定事件以每晚运行您的查询。也请查看Event Scheduler。
CREATE EVENT `purge_table` ON SCHEDULE
EVERY 1 DAY
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT ''
DO BEGIN
DELETE FROM my_table WHERE my_timestamp_field <= now() - INTERVAL 5 DAY
END
【解决方案2】:
什么是餐桌设计?你有一个带有时间戳的列吗?
假设你这样做了,你可以在删除命令中使用带有 datediff(your_date,CURDATE()) 的时间戳值。
从 datediff(date_col, CURDATE ()) > your_num_days 的表中删除。
【解决方案3】:
自我回答
制作一个每周末向数据库发送以下 SQL 的 Web 服务器:
DELETE FROM table WHERE timestamp
或
从表中删除
WHERE 时间戳
我可能需要锁定以防止工作堆积,如下所示:
DELIMITER //
CREATE EVENT testlock_event ON SCHEDULE EVERY 2 SECOND DO
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('testlock_event');
END;
IF GET_LOCK('testlock_event', 0) THEN
-- add some business logic here, for example:
-- insert into test.testlock_event values(NULL, NOW());
END IF;
DO RELEASE_LOCK('testlock_event');
END;
//
DELIMITER ;
最终答案:
CREATE EVENT `purge_table` ON SCHEDULE
EVERY 1 DAY
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT ''
DO BEGIN
IF GET_LOCK('purge_table', 0) THEN
DELETE FROM table WHERE timestamp < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY));
END;
【解决方案4】:
也许您可以提供更多信息,说明您如何将数据推送到数据库以及您如何在数据库上工作?因此,我们可以帮助您,而不必与黑暗作斗争......
我将提供一个简单的解决方案:这是一种解决方法,但有效:
每次触摸数据时,都会更新更新行中的时间戳。
因此,您可以在每个星期日轻松过滤掉它们。
更新
作者自己提供的答案,在 Stackoverflow 上讨论过,似乎不是完全那样工作,比较the discussion。