2012-09-07 43 views
3

我有一个存储过程,在临时表中插入大约3K行。这个SP在Mysql 5.1(windows桌面)上用了3秒钟,同样的SP在Mysql 5.5上花了大约2分钟。Mysql 5.5 Innodb缓慢插入查询问题

我尝试了很多东西,如通过更改innodb_buffer_pool_size等来优化innodb,但没有任何工作,然后我读了一些关于stackoverflow的东西,它解决了我的问题。

START TRANSACTION; 
CALL sp(); 
COMMIT; 

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

+0

您是一次添加一行还是批量插入? – ethrbunny

+0

一次一个,插入发生在一个循环中 – Sumedh

+0

如果你可以把它们作为一个批处理(即'insert into tbl(var)values(v1),(v2),(v3),...'),它会SQL可能会通过批量整个过程来“帮助你”,只是猜测 – ethrbunny

回答

0

添加以下线在我mysql.ini文件

innodb_flush_log_at_trx_commit=0 

这似乎已经解决了这个问题,该过程现在跑得快。理想情况下innodb_flush_log_at_trx_commit应该为1符合ACID。

0

我想这是由于自动提交运行

START TRANSACTION; 

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

SET autocommit=0; 
0

当您向InnoDB表中插入一行时,MySQL将生成primary_key并更新该行的索引。这是为每行完成的,并且可能会显着降低插入速度。通过将它们包装在一个事务中,你基本上迫使它首先插入所有的行,然后一次重建键和索引。因此性能增益。

+0

哦,我不知道,谢谢。 – Sumedh