从MySQL数据库删除数百万行的最快方法是什么?

时间:2019-02-18 18:20:41

标签: mysql sql

我的数据库空间不足,因此我对旧记录进行了备份。现在,我必须清除这些记录,并且我的参考列是“日期”。

我尝试使用标准方法:

DELETE FROM table WHERE date >= '2017-01-01' AND date <= '2017-12-31'

但这显然要花费太多时间,因为要删除的行超过700万行。有没有办法加快速度?我试图将数据分成几个月甚至更小的块,但是在运行代码一段时间后,我与服务器断开了连接。

谢谢。

编辑:

CREATE TABLE table (

  id INT(11) NOT NULL AUTO_INCREMENT,
  date DATE DEFAULT NULL,
  # 18 more columns

  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 29616055,
AVG_ROW_LENGTH = 317,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;

2 个答案:

答案 0 :(得分:3)

如果有足够的空间,请创建一个临时表并重新加载原始表:

create table temp_t as
    select *
    from table
    where date >= '2018-01-01';

truncate table t;

insert into t
     select *
     from temp_t;

这节省了delete的所有日志记录开销-可能会非常昂贵。

接下来,您需要了解分区。这使过程简单得多。您只能删除分区,而不是删除行-并且没有逐行记录删除分区的方法。

答案 1 :(得分:1)

  1. 创建表的空副本(键和全部)。
  2. 插入...从原始数据中选择要保留的数据复制到副本中。
  3. 删除所有引用原始表的外键约束。
  4. 删除原始表。
  5. 将副本重命名为原始名称。
  6. 重新创建在步骤3中删除的所有外键。