首页>Database>source

我有一些表具有数百万行(最多6MLN),并且我需要执行删除以减少行数.我创建了一个带有循环的过程,该过程每次执行都会删除10k条记录。

我确实看到的是,在执行某些命令之后,表开始响应非常慢,并且分配也不再响应,例如:

  1. 首次安装,要删除30k条记录,时间为35秒
  2. 第二次迭代,删除126k条记录,时间3.4分钟
  3. 第三次迭代,删除350k条记录,时间为24分钟

每次迭代时,我都会每10k条记录提交一次提交.因此,第一次迭代需要删除3万条记录,并每提交1万条记录。

I see that every time i execute the procedure the table grow (and does not decrease, what i was expecting...)

在这篇文章之前,我正在努力寻找一个好的解决方案,没有运气。

我无法删除并减少具有更少记录的表,因此我需要找到一种方法来降低表上的记录。

我该如何删除所有保持性能的记录? 可用空间,"构建良好的索引"等

如果需要,我可以为您提供更多详细信息

最新回答
  • 1月前
    1 #

    对于"大"删除(超过一半的表格),请执行以下操作:

    CREATE TABLE new LIKE real;
    INSERT INTO new
        SELECT * FROM real WHERE ...  -- what to keep
    RENAME TABLE real TO old,
                 new TO real;
    DROP TABLE old;
    

    INSERT..SELECT 是慢的; 其他步骤很快.除非原始表是使用 innodb_file_per_table=OFF创建的,否则无需"缩小" ,在这种情况下,磁盘使用率将通过此过程增加

    更多情况下的更多大删除技巧:http://mysql.rjweb.org/doc.php/deletebig

  • sql server:动态变更跟踪查询错误?
  • 将具有动态列数和行数的时间序列数据存储到合适的数据库中