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

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

什么是最好的选择?

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

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

谢谢!

【问题讨论】:

    标签: mysql sql sql-delete large-data


    【解决方案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】:

    最快的方法是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多