使用mysql中的分区删除大量数据

时间:2016-01-26 13:41:18

标签: mysql mysql-workbench partitioning

我有一张不断增长的桌子。

我想删除超过1年的行(定期 - 每12小时)

起初我以为使用普通的删除语句,但它不好,因为有很多条目,数据库会卡住。 然后我读到我可以使用另一种方法 - 移动"未删除"输入到新表,重新对其表示并使用drop表示旧表。

我想尝试的方法(而不是确定如何做)是使用partitioning

我想接受我的领域 - created并将其分为几个月,然后每个月删除同一个月 - 一年前。 例如:每月一次,1.1.2016 - >删除2015年1月的所有条目。

我删除了主键并将其添加为索引(因为我收到错误1503)。 但仍然无法弄清楚如何做到这一点.. 你能告诉我吗?

这是表格:

    CREATE TABLE `myTable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  `file_name` varchar(255) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

添加 - 我试过了:

    ALTER TABLE myTable
   PARTITION BY RANGE( YEAR(created) )
SUBPARTITION BY HASH( MONTH(created) )
    SUBPARTITIONS 12 (
        PARTITION january VALUES LESS THAN (2),
        PARTITION february VALUES LESS THAN (3),
        PARTITION march VALUES LESS THAN (4),
        PARTITION april VALUES LESS THAN (5),
        PARTITION may VALUES LESS THAN (6),
        PARTITION june VALUES LESS THAN (7),
        PARTITION july VALUES LESS THAN (8),
        PARTITION august VALUES LESS THAN (9),
        PARTITION september VALUES LESS THAN (10),
        PARTITION october VALUES LESS THAN (11),
        PARTITION november VALUES LESS THAN (12),
        PARTITION december VALUES LESS THAN (13)
    );

但我在尝试将Table has no partition for value 2016设置为created

时始终收到错误:2016-01-26 15:37:22

1 个答案:

答案 0 :(得分:0)

  • HASH分区没有任何用处。
  • RANGE分区需要特定的范围。
  • 要保留一年的数据,但在12小时内删除,则需要730个分区;这是不切实际的。

相反,我建议PARTITION BY RANGE有14个月度范围(或54个每周)范围,DROP整个月(或一周)。例如,它现在是1月中旬,因此每月将有:2015年1月15日,2015年2月,......,2016年1月,未来。

接近2016年1月底,REORGANIZE未来到2016年2月和未来 2016年2月初,DROP 1月15日。

是的,您最多有一个月(或一周)的数据等待删除,但这可能不是什么大问题。并且非常效率。

我会写一个日常的cron工作来做“如果是时候放弃,这样做”和“如果是时候重新组织,那么”。

More details