首页 > 解决方案 > 从 MySQL 数据库中删除数百万行的最快方法是什么?

问题描述

我的数据库空间不足,所以我对旧记录进行了备份。现在我要清除这些记录,我的参考栏是“日期”。

我尝试使用标准方法:

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;

标签: mysqlsql

解决方案


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

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

truncate table t;

insert into t
     select *
     from temp_t;

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

接下来,您需要了解分区。这使得该过程更加简单。您可以只删除一个分区,而不是删除行——并且没有用于删除分区的逐行日志记录。


推荐阅读