我有一张不断增长的桌子。
我想删除超过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
答案 0 :(得分:0)
HASH
分区没有任何用处。RANGE
分区需要特定的范围。相反,我建议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工作来做“如果是时候放弃,这样做”和“如果是时候重新组织,那么”。