如何从 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 数据库表中清除旧条目?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从具有重复引用条目的联合表中选择唯一记录

删除不同表中的条目 MySQL 查询

Codeigniter 从一个数据库表中获取数据并用它在另一个表中创建一个条目的麻烦

如何使用 Take 和 Skip 方法从数据库表中获取所有条目?

我想从数据库表中选择最后 5 个条目并将其显示在页面上。如何使用 JSP 实现它?

Hibernate Envers:如何从我的审计表中删除条目?