MySQL delete 语句如何影响超过 3000 万条记录的表?

Rob*_*iel 5 mysql delete

我必须从 MySQL 的 InnoDB 表中删除大约 2800 万条记录。我想知道如果我在删除操作期间在同一个表上执行 select 语句会发生什么。我想删除需要一些时间才能完成。

我使用的是 MySQL 5.6 版。我不想删除所有我将有条件或可能拥有的记录。感谢您的时间。

dno*_*eth 8

与其删除大部分行,不如取消 WHERE 条件并将剩余的行插入/选择到新表中。然后删除原始表并将新表重命名为旧表(或截断并重​​新插入)。这样,只有一个非常小的时间段 (DROP/RENAME) 表不可用。这是数据仓库中一个非常常见的过程,您可以在其中处理大量行。

您需要在单个事务中同时运行 INSERT/SELECT 和 DROP TABLE,因此没有其他会话能够在 INSER 和 DROP 之间执行任何 DML。我不知道确切的 mySQL/InnoDb 语法和事务行为,但这是一个骨架(当然你需要先测试):

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 
START TRANSACTION;
LOCK TABLES newTab WRITE; 
INSERT INTO newTab SELECT * FROM oldTab; 
DROP TABLE oldTab;  -- might need a COMMIT?;
RENAME newTab TO oldTab;
COMMIT; -- ?
Run Code Online (Sandbox Code Playgroud)