我正在尝试通过 mysql 查询(无连接)从表中删除超过 200 万条记录。该表有大约 8000 万条记录。
我用过set autocommit=0;
,需要很长时间才能完成。如果我使用 运行查询,这会更快autocommit=1
吗?
我正在尝试通过 mysql 查询(无连接)从表中删除超过 200 万条记录。该表有大约 8000 万条记录。
我用过set autocommit=0;
,需要很长时间才能完成。如果我使用 运行查询,这会更快autocommit=1
吗?
我假设您的表是InnoDB。对于这 200 万行,它需要跟踪每次修改的撤消日志条目。这会在内存中累积并最终进入磁盘。这就是为什么它需要很长时间。如果你分块执行,这将阻止它进入磁盘并让 MySQL 跟踪较少的撤消日志条目,从而提高效率。
自动提交发生在您的查询结束时,因此它不会做任何事情。
弄清楚你的块大小应该是多少的最好方法是通过实验。就像是
delete from table1 limit 1000;
然后继续加倍,直到你想出最好的每次删除行的比率。
我假设您正在尝试运行 200 万条单独的删除语句。
如果您尝试使用主键或范围一次删除 100-1000 条记录进行批量删除,速度会快得多。
例子:
DELETE FROM Table WHERE ID > 0 AND ID < 1000;
或者
DELETE FROM Table WHERE ID IN (1,2,3,4,5 .... 1000);
您可以根据自己的喜好调整要删除的记录数,如果需要,可以增加很多。在高负载生产服务器上,我通常会运行像这样的较小范围的脚本,可能会运行 100 次,然后再休眠一段时间,然后继续另一个循环。
我总是为这种类型的事情打开自动提交功能。管理删除 200 万条记录的事务会增加大量开销。
此外,请确保您用于批量/范围删除的列是主键或具有索引。
更改自动提交变量的值不会更快。即使自动提交为真,MySQL 也总是构建旧图像,因为如果用户中断查询,那么它必须有旧图像才能回滚。