MySQL 大删除

标签 mysql

我需要从 MySQL 中的大型 INNODB 表中删除大量行。

表中有数百万行,这个语句可能需要几分钟,也许几个小时。

我尝试过这个存储过程但没有成功,因为循环中的 SQL 语法有错误。

如何从大表中删除大量行?

   BEGIN
   Set @a = SELECT MIN(sId) FROM doTable;
   LOOP
      SELECT @z := sId FROM doTable WHERE sId >= @a ORDER BY sId LIMIT 1000,1;
      If @z is null
         exit LOOP
      DELETE FROM doTable
         WHERE sId >= @a
           AND sId <  @z
           AND sType IS NULL
      SET @a = @z
      sleep 3
   ENDLOOP
   DELETE FROM doTable
      WHERE sId >= @a
        AND sType IS NULL;
END

最佳答案

这是一个工作示例,添加了 sleep ,很好:

DROP PROCEDURE IF EXISTS clean_someTable;

DELIMITER $$

CREATE PROCEDURE clean_someTable()

BEGIN   
    REPEAT
        DO SLEEP(1);
        DELETE FROM someTable 
        WHERE (created_at < NOW() - INTERVAL 1 MONTH) 
        ORDER BY primary_key_id 
        LIMIT 10000;        
    UNTIL ROW_COUNT() = 0 END REPEAT;
END$$

DELIMITER ;

CALL clean_someTable();

关于MySQL 大删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260968/

相关文章:

php - 如何在单个查询中发送此 SQL 语句?

mysql - 根据当前值更新字段(在 mysql 中)

java.lang.illegalargumentexception :cannot set a null TableModel

mysql - 与昨天相比没有 LAG 分析功能的用户百分比

php - Mysql - 查询和索引

PHP OOP 分页

mysql - select count(*) 查询太慢。我猜索引是行不通的

mysql - 计算三重联接中每个表的记录数

mysql - 自动增量: how to auto_increment a combined-key (ERROR 1075)

php - 查询每行两个互补值