0

我正在尝试通过 mysql 查询(无连接)从表中删除超过 200 万条记录。该表有大约 8000 万条记录。

我用过set autocommit=0;,需要很长时间才能完成。如果我使用 运行查询,这会更快autocommit=1吗?

4

3 回答 3

2

我假设您的表是InnoDB。对于这 200 万行,它需要跟踪每次修改的撤消日志条目。这会在内存中累积并最终进入磁盘。这就是为什么它需要很长时间。如果你分块执行,这将阻止它进入磁盘并让 MySQL 跟踪较少的撤消日志条目,从而提高效率。

自动提交发生在您的查询结束时,因此它不会做任何事情。

弄清楚你的块大小应该是多少的最好方法是通过实验。就像是

delete from table1 limit 1000;

然后继续加倍,直到你想出最好的每次删除行的比率。

于 2013-03-19T14:19:46.160 回答
1

我假设您正在尝试运行 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 万条记录的事务会增加大量开销。

此外,请确保您用于批量/范围删除的列是主键或具有索引。

于 2013-03-19T05:49:18.733 回答
0

更改自动提交变量的值不会更快。即使自动提交为真,MySQL 也总是构建旧图像,因为如果用户中断查询,那么它必须有旧图像才能回滚。

于 2016-08-01T07:21:08.747 回答