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

标签 mysql mysql-workbench partitioning

我有一个不断增长的表。

我想删除超过 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 月初,DROP15 年 1 月。

是的,您将有长达一个月(或一周)的数据等待删除,但这可能不是什么大问题。而且它会非常高效。

我会编写一个每日 cron 作业来执行“如果是时候放弃,就这样做”和“如果是时候重组,就这样做”。

More details .

关于mysql - mysql中使用分区删除大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35015176/

相关文章:

MySQL Workbench - 自引用表和自定义脚本

mysql - 加载数据文件不影响任何行

php - MySQL workbench 连接数据库的方法

mysql - 基于用户名第一个字符的分片是一致性哈希的示例吗?

mysql - MongoDB - 正确使用集合?

c++ - AABB 的分区

php - Wordpress 中的 SQL SELECT 函数不起作用

mysql - 为什么 MySQL 在尝试插入日期时间 '2019-08-13 19:00:00' 时会出错?

MySQL 内连接/最大值/组

mysql - 触发在特定日期删除数据库