PDO / PHP / MySQL中的性能:事务与直接执行

时间:2009-09-12 17:07:43

标签: php sql mysql transactions pdo

我循环遍历许多值(例如1到100)并在循环内执行预准备语句。

使用事务是否有优势 - 循环结束后提交 - 与循环内的直接执行相比?

这些值不是相互依赖的,因此从这个角度来看不需要事务。

3 个答案:

答案 0 :(得分:4)

如果您的查询是INSERT,MySQL手册的页面7.2.19. Speed of INSERT Statements会提供两个有趣的信息,具体取决于您是否使用了事务引擎:

使用非事务性引擎时:

  

加快INSERT操作   用多个语句执行   非交易表,锁定你的   表。

     

这有利于表现,因为   索引缓冲区仅刷新到磁盘   一次,在所有INSERT语句之后都有   完成。通常,会有   有很多索引缓冲区刷新   INSERT语句。显式锁定   如果可以的话,不需要陈述   使用单个INSERT插入所有行。

并且,使用transactionnal引擎:

  

获得更快的插入效果   事务表,你应该使用   改为START TRANSACTION和COMMIT   LOCK TABLES。

所以我猜测使用事务可能是一个好主意 - 但我认为这可能取决于服务器上的负载,以及是否在同一时刻使用同一个表有多个用途,以及所有......

我链接的页面上有更多信息,所以请不要犹豫,阅读它; - )


而且,如果你正在做update statements

  

获得快速更新的另一种方法是   延迟更新,然后进行许多更新   后来连续。执行多个   一起更新要快得多   如果你锁定,一次做一个   表

所以,我猜可以说与插入相同。


顺便说一下:可以肯定的是,你可以试试这两种解决方案,例如在PHP端使用microtime对它们进行基准测试; - )

答案 1 :(得分:3)

为了更快的时间,你可以一次性完成所有插入,或者将它们组合在一起,一次可能是5或10个,就像一个插入失败整个批次一样。

http://www.desilva.biz/mysql/insert.html

交易会降低您的速度,所以如果您不需要它,请不要使用它。

即使您进行批量插入,准备好的声明也是一个不错的选择,因为您不必每次都继续构建查询。

答案 2 :(得分:3)

当我必须实现CSV文件(可能很长)数据导入时,我遇到了同样的问题(我知道你可以使用LOAD DATA INFILE语法,但我必须在插入之前对我的字段应用一些处理)。

所以我用事务和一个大约15k行的文件做了一个实验。结果是,如果我在一个唯一的事务中插入所有记录,它只需要几秒钟,并且它是cpu绑定的。如果我根本不使用任何事务,则需要几分钟时间,并且它是IO限制的。 通过提交每N行,我得到了中间结果。