我有一个不断增长的表。
我想删除超过 1 年的行(定期 - 每 12 小时)
一开始我想使用普通的删除语句,但是这样不好,因为条目很多,数据库会卡住。
然后我读到我可以使用另一种方法 - 将“未删除”条目移动到新表,重新命名它并对旧表使用 drop
。
我想尝试的方法(不太确定如何做)是使用分区
。
我想将我的字段 - created
并将其划分为几个月,然后每个月删除同一个月 - 一年前。
示例:每月一次,2016 年 1 月 1 日 -> 删除 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)
);
但我总是收到错误:在尝试将 created
设置为 2016-01-26 15:37:22 时,
Table has no partition for value 2016
最佳答案
HASH
分区没有做任何有用的事情。RANGE
分区需要特定范围。- 要保留一年的数据,但以 12 小时为单位进行删除,需要 730 个分区;这是不切实际的。
相反,我建议PARTITION BY RANGE
包含 14 个每月范围(或 54 个每周)范围,并DROP
整个月(或周)。例如,现在是 1 月中旬,因此每月将有:Jan'15、Feb'15、...、Jan'16、Future。
临近 16 年 1 月末,重组
Future 为 2016 年 2 月和 Future。
2016 年 2 月初,DROP
15 年 1 月。
是的,您将有长达一个月(或一周)的数据等待删除,但这可能不是什么大问题。而且它会非常高效。
我会编写一个每日 cron 作业来执行“如果是时候放弃,就这样做”和“如果是时候重组,就这样做”。
关于mysql - mysql中使用分区删除大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35015176/