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大表删除的主要内容,如果未能解决你的问题,请参考以下文章