MySQL 大删除

Che*_*and 1 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
Run Code Online (Sandbox Code Playgroud)

Sil*_*mer 5

这是一个工作示例,添加了睡眠,这样会更好:

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();
Run Code Online (Sandbox Code Playgroud)