我循环遍历许多值(例如1到100)并在循环内执行预准备语句。
使用事务是否有优势 - 循环结束后提交 - 与循环内的直接执行相比?
这些值不是相互依赖的,因此从这个角度来看不需要事务。
答案 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行,我得到了中间结果。