使用autocommit = 0的Mysql查询性能

时间:2013-03-19 05:44:33

标签: mysql

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

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

3 个答案:

答案 0 :(得分:1)

我假设您正在尝试运行200万个删除语句。

如果您尝试使用主键或范围批量删除一次删除100-1000条记录,则会快得多。

示例:

DELETE FROM Table WHERE ID > 0 AND ID < 1000;

OR

DELETE FROM Table WHERE ID IN (1,2,3,4,5 .... 1000);

您可以根据自己的喜好调整要删除的记录数,如果需要可以增加一点。在高负载生产服务器上,我通常运行具有较小范围的脚本,这可能是100次,然后再睡一会儿,然后继续另一个循环。

我总是为这类事情开启自动提交。管理事务以删除200万条记录会增加很多开销。

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

答案 1 :(得分:1)

我假设你的桌子是 InnoDB 。对于那些200万行,它需要跟踪每个修改的撤消日志条目。这会在内存中建立并最终进入磁盘。这就是为什么它需要很长时间。如果以块的形式进行,那将阻止它进入磁盘,并且MySQL可以跟踪更少的撤消日志条目,从而提高效率。

自动提交在查询结束时发生,因此它不会执行任何操作。

找出你的块大小应该是什么的最好方法是通过实验。像

这样的东西
delete from table1 limit 1000;

然后保持加倍,直到你得出每个时间比删除的最佳行数。

答案 2 :(得分:0)

更改autocommit变量的值不会更快。即使autocommit为true,MySQL也始终构建旧映像,因为如果用户中断查询,则必须使用旧映像进行回滚。