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

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

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

有帮助吗?

解决方案

如果您的查询是INSERT,则页面 7.2.19 。 MySQL手册的INSERT语句速度提供了两个有趣的信息,具体取决于您是否使用了事务引擎:

使用非事务性引擎时:

  

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

     

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

并且,使用transactionnal引擎:

  

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

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

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

,点击 并且,如果您正在更新声明

  

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

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

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

其他提示

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top