mysql大表删除

Posted

技术标签:

【中文标题】mysql大表删除【英文标题】:mysql large table delete 【发布时间】:2021-01-23 11:09:09 【问题描述】:

我正在使用 mysql 数据库版本 5。我有一个表,它有大约 500.000.000 行。如果我信任 phpmyadmin,该表将回收 50GB 的磁盘空间。我喜欢删除 90% 的行来回收磁盘空间。

什么是最好的选择?

我可以使用脚本删除行并运行“OPTIMIZE TABLE”。桌子将被锁定,但我不知道需要多长时间?有人有经验吗?

我可以删除表,创建一个新表并手动导入 10%。这种大小的 drop table 需要多长时间?

谢谢!

【问题讨论】:

【参考方案1】:

由于您要删除表中的大部分行,我建议您将要保留的行移动到临时表中,截断表,然后重新导入。这仍然需要对表进行停机(即,在操作进行时不应对表进行读取或写入),但应该比逐行删除快一个数量级。

create table tmptable as select * from mytable where ...;
truncate table mytable;
insert into mytable select * from tmptable;
drop table tmptable;

隐式地,truncate table 删除并重新创建表,这将回收空间。对于您的问题,documentation 有一些有趣的要点,例如:

截断操作删除并重新创建表,这比逐行删除要快得多,尤其是对于大型表。

【讨论】:

你能估计一下没有任何插入的“截断”过程需要多长时间吗?我需要告诉用户停机时间。 truncate 应该非常快(这是底层的 DDL 操作,它会删除并重新创建表)。 然后“丢弃”从磁盘中删除一个 50GB 的文件?只需几分钟?【参考方案2】:

最快的方法是

    将所需文件复制到临时表中。 截断表格 将它们从临时表中复制回来

【讨论】:

以上是关于mysql大表删除的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 中的大表中删除重复项的最快过程是啥

删除两个 MySQL 大表中的匹配记录

mysql 生产库大表delete

MySQL8 大表清空和删除正确方法

大表分批删除脚本之MySQL版

MySQL使用硬链接的方式删除大表