3

我有一个存储过程,它在临时表中插入大约 3K 行。这个 SP 过去在 Mysql 5.1(Windows 桌面)上需要 3 秒,相同的 SP 在 Mysql 5.5 上需要大约 2 分钟。

我尝试了很多事情,例如通过更改 innodb_buffer_pool_size 等来优化 innodb,但没有任何效果,然后我在 stackoverflow 上阅读了一些内容,解决了我的问题。

START TRANSACTION; 
CALL sp();
COMMIT;

上面的代码解决了这个问题,现在我回到了 3 秒的执行时间。有人可以告诉我这里到底发生了什么。为什么我必须在 5.5 中添加启动事务才能快速执行?为什么我在 5.1 中不需要这个

4

3 回答 3

0

我猜这是由于自动提交被运行禁用

START TRANSACTION; 

您可以通过手动禁用自动提交来验证它,然后运行您的 proc。

SET autocommit=0;
于 2012-09-10T07:55:22.827 回答
0

我在 mysql.ini 文件中添加了以下行

innodb_flush_log_at_trx_commit=0

它似乎已经解决了这个问题,程序现在运行得很快。理想情况下,innodb_flush_log_at_trx_commit 应该为 1 以符合 ACID。

于 2012-09-15T06:54:04.720 回答
0

当您在 InnoDB 表中插入一行时,MySQL 会构建 primary_key 并更新该行的索引。这是针对每一行完成的,并且会大大减慢您的插入速度。通过将它们包装在事务中,您实际上是在强制它首先插入所有行,然后一次性重建键和索引。因此性能增益。

于 2013-03-13T02:59:57.787 回答