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

从MySQL数据库中删除数百万行的最快方法是什么?,mysql,sql,Mysql,Sql,我的数据库空间用完了,所以我对旧记录进行了备份。现在我必须清除这些记录,我的参考栏是“日期” 我尝试使用标准方法: DELETE FROM table WHERE date >= '2017-01-01' AND date <= '2017-12-31' 如果有足够的空间,则创建临时表并重新加载原始表: create table temp_t as select * from table where date >= '2018-01-01'; tru

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

我尝试使用标准方法:

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

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

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

truncate table t;

insert into t
     select *
     from temp_t;
这节省了删除的所有日志记录开销,而且这可能非常昂贵

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

创建表键和所有键的空副本。 插入…选择要保留的原始数据到副本中。 删除引用原始表的所有外键约束。 放下原来的桌子。 将副本重命名为原始名称。 重新创建在步骤3中丢弃的所有外键。
你试过调试这个问题吗?是否有索引集?表的引擎是InnoDB还是MyISAM?或者,要回答my和Nico的问题,请将表的CREATE语句添加到您的问题中。这可能是因为您的日期字段没有索引。MySql或Sql标记请将表'table'添加索引日期'U索引'date';你的专栏日期类型是什么?很好。它很有魅力。我已经在大约11亿行上测试了这个答案,结果与预期的一样。谢谢分享这个答案。这是一个很好的替代删除的方法,我想知道如何才能更快地创建表。@joel。日志记录更少,锁定的影响最小。
create table temp_t as
    select *
    from table
    where date >= '2018-01-01';

truncate table t;

insert into t
     select *
     from temp_t;