如何从 MySQL 数据库表中清除旧条目?
Posted
技术标签:
【中文标题】如何从 MySQL 数据库表中清除旧条目?【英文标题】:How do I clear old entries from a MySQL database table? 【发布时间】:2017-01-10 21:43:20 【问题描述】:我有一个 mysql 数据库,里面有一张大表。一段时间后,它变得太满并且性能下降。每个星期天,我都想删除最后一次更新早于特定天数的行。
我该怎么做?
【问题讨论】:
安排它在每个星期天运行查看这篇文章查看 rkosegi ***.com/questions/9621355/…的答案 我倾向于保留所有行。您可能需要考虑分区方案。 【参考方案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】:也许您可以提供更多信息,说明您如何将数据推送到数据库以及您如何在数据库上工作?因此,我们可以帮助您,而不必与黑暗作斗争......
我将提供一个简单的解决方案:这是一种解决方法,但有效:
每次触摸数据时,都会更新更新行中的时间戳。
因此,您可以在每个星期日轻松过滤掉它们。
更新
作者自己提供的答案,在 *** 上讨论过,似乎不是完全那样工作,比较the discussion。
【讨论】:
以上是关于如何从 MySQL 数据库表中清除旧条目?的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 从一个数据库表中获取数据并用它在另一个表中创建一个条目的麻烦
如何使用 Take 和 Skip 方法从数据库表中获取所有条目?