问题描述
我正在使用版本5的MysqL数据库。我有一个表,该表具有约500.000.000行。如果我信任PHPmyadmin,该表将回收50GB的磁盘空间。我想删除90%的行以回收磁盘空间。
什么是最佳选择?
-
我可以使用脚本删除行并运行“ OPTIMIZE TABLE”。桌子将被锁住,但我不知道需要多长时间?有人有经验吗?
谢谢!
解决方法
由于您要删除表中的大多数行,因此建议将要保留的行移到临时表中,将其截断,然后重新导入。这仍然需要在表上停机(也就是说,在进行操作时不应对表进行读取或写入操作),但比逐行删除要快一个数量级。
create table tmptable as select * from mytable where ...;
truncate table mytable;
insert into mytable select * from tmptable;
drop table tmptable;
truncate table
会删除并重新创建表,该表将回收空间。 documentation关于您的问题有一些有趣的要点,例如:
,截断操作可删除并重新创建表,这比逐行删除行要快得多,特别是对于大型表。
最快的方法是
- 将所需文件复制到临时表中。
- 截断表格
- 从临时表中复制它们