如何清除MySQL数据库表中的旧条目?

时间:2017-01-10 21:43:21

标签: mysql sql database triggers

我有一个MySQL数据库,里面有一个大表。一段时间后,它变得太满,性能下降。每个星期天,我都想删除上次更新时间超过特定天数的行。

我该怎么做?

4 个答案:

答案 0 :(得分:0)

自我答案

创建一个Web服务器,每周末将以下SQL发送到数据库:

  

DELETE FROM table WHERE timestamp< DATE_SUB(NOW(),INTERVAL 7 DAY);

  

DELETE FROM table

     

时间戳< UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 7 DAY))

我可能需要锁定以防止工作积累,如下所示:

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;

答案 1 :(得分:0)

桌面设计是什么?你有一个带时间戳的专栏吗?

假设您这样做,您可以在删除命令中将该timestamp值与datediff(your_date,CURDATE())一起使用。

从表中删除datediff(date_col,CURDATE())&gt; your_num_days。

答案 2 :(得分:0)

制作预定活动,每晚运行您的查询。查看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

答案 3 :(得分:-1)

也许您可以提供有关如何将数据推送到数据库以及如何处理数据库的更多信息?因此,我们可以帮助你,不必与黑暗斗争......

我会提供一个简单的解决方案:它的解决方法,但有效:

每次触摸数据时,都会更新更新行中的时间戳。

因此,您可以在每个星期天轻松过滤掉它们。

更新

作者自己提供的答案在Stackoverflow上进行了讨论,并且似乎没有以这种方式工作,比较the discussion