从mysql表中删除旧记录但保留备份

时间:2013-06-07 23:01:17

标签: mysql performance replication

我有一个MYSQL表,只需要在今天日期之前30天才能获得数据。它的数据可能在今天之后的几年内。为了更快地查询,我通常会删除旧记录,因为我认为没有必要搜索旧记录。但是,如果我们需要它来进行分析,我仍会保留记录的备份副本。原始表是这样的:

CREATE TABLE featured_deal (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      fsa VARCHAR(10),
      poster_id int(11),
      dealid bigint(20),
      bookedDate date,
      createDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY `featured_unique`(fsa, bookedDate)
    )

我创建了一个表,该表是此表的副本,名为history:

CREATE TABLE featured_deal_history (
             id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
              fsa VARCHAR(10),
              poster_id int(11),
              dealid bigint(20),
              bookedDate date,
              createDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
            UNIQUE KEY `featured_unique`(fsa, bookedDate)
            )

每当原始表上发生插入时,我都会触发填充历史记录表:

CREATE TRIGGER `featured_to_history`
            AFTER INSERT ON lst_enmasse_featured_deal 
            FOR EACH ROW
            INSERT INTO lst_enmasse_featured_deal_history (fsa,poster_id,dealid,bookedDate,createDate)
            VALUES (NEW.fsa,NEW.poster_id,NEW.dealid,NEW.bookedDate,NEW.createDate)

最后,我使用cron作业和命令清理表:

    DELETE * FROM featured_deal WHERE bookedDate < DATE_SUB(CURDATE(), INTERVAL 30 DAY)

有没有更好的方法来执行上述任务?我想到了MYSQL分区。但是,我没有固定的分区。日期发生变化,因此我每天都需要两个新分区。

2 个答案:

答案 0 :(得分:1)

原则上你的aproach是可以的,但是这个概念的前提是较小的表更高效。这会影响您的查询针对数据运行全表扫描 - 即您没有正确配置索引。

我建议您修复的第一件事就是查询的效果。

如果您仍然需要将内容保留在热数据表之外,那么您应该尝试将任何插入到历史表中作为批量操作而不是一次一行 - 这将使表和索引保持健康状态。这可以在Cristian建议的批处理操作中完成,或者您可以使用随机方法(在源表中使用状态变量)。例如类似......

AFTER INSERT ON mytable
IF (0.95<RAND()) THEN
   UPDATE mytable SET control=CONNECTION_ID()
   WHERE control IS NULL;
   INSERT INTO backuptable (...)
     SELECT .... FROM mytable
     WHERE control=CONNECTION_ID();
   UPDATE mytable SET control=-1
   WHERE control=CONNECTION_ID();
 END IF;

进一步考虑的是,当您写入历史记录表时,您会生成一个新的ID:为什么?

答案 1 :(得分:0)

我会让它变得更简单。创建一个每日cron,使用&#34; TODAY_DATE&#34;执行这两个查询:

create table if not exists featured_deal_new like featured_deal
rename table featured_deal to featured_deal_history_TODAY_DATE, featured_deal_new to featured_deal

会发生什么:(重命名表格非常快)。您将拥有每天的历史记录表。

随后可以随意组合历史记录表

insert into featured_deal_history... select * from featured_deal_history_TODAY_DATE

Drop table featured_deal_history_TODAY_DATE

这样,您不会在主表中的插入上失去性能。