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

PDO/PHP/MySQL中的性能:事务与直接执行,php,sql,mysql,transactions,pdo,Php,Sql,Mysql,Transactions,Pdo,我正在循环一系列的值(例如1到100),并在循环中执行一个准备好的语句 与在循环内直接执行相比,使用事务(在循环结束后提交)是否有优势 这些值互不依赖,因此从这个角度来看不需要事务。如果您的查询是INSERT,MySQL手册的页面会根据您是否使用事务引擎提供两个有趣的信息: 使用非事务性引擎时: 要加快插入操作,请执行以下操作: 使用多个语句执行 非事务表,锁定您的 桌子 这有利于性能,因为 索引缓冲区仅刷新到磁盘 一次,在所有INSERT语句完成之后 完整的。通常情况下,会有 有很多索引缓冲区

我正在循环一系列的值(例如1到100),并在循环中执行一个准备好的语句

与在循环内直接执行相比,使用事务(在循环结束后提交)是否有优势


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

如果您的查询是INSERT,MySQL手册的页面会根据您是否使用事务引擎提供两个有趣的信息:

使用非事务性引擎时:

要加快插入操作,请执行以下操作: 使用多个语句执行 非事务表,锁定您的 桌子

这有利于性能,因为 索引缓冲区仅刷新到磁盘 一次,在所有INSERT语句完成之后 完整的。通常情况下,会有 有很多索引缓冲区刷新 插入语句。显式锁定 如果可以,则不需要语句 用一次插入插入所有行

并且,使用transactionnal引擎:

要获得更快的插入,请执行以下操作: 事务表,您应该使用 启动事务并提交 一张锁桌

所以我猜使用事务可能是个好主意——但我想这可能取决于服务器上的负载,以及是否有多个用户在同一时刻使用同一个表,等等

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


如果你正在做:

获取快速更新的另一种方法是 延迟更新,然后执行许多更新 在一排之后。执行多重 一起更新要比一起更新快得多 如果您锁定了 桌子

所以,我猜这和插页是一样的



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

为了更快,您可以一次完成所有插入,或者将它们组合在一起,一次可能5或10个,就像一个插入失败一样,整个批次都将失败

一个事务会减慢你的速度,所以如果你不需要它,就不要使用它


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

当我必须实现CSV文件(可能相当长)数据导入时,我也遇到了同样的问题(我知道您可以使用该语法,但我必须在插入之前对字段进行一些处理)

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

非常感谢您提供的信息,我想我只需要尝试和基准测试。我想是的^^^让我们知道结果;-)其他人可能会感兴趣!另外,顺便说一句:另一种解决方案是使用一个插入查询同时执行多个插入操作,从而减少查询的总数——编码有点困难,但我已经看到了这方面的巨大改进,因为这意味着从一台服务器到另一台服务器的调用更少。是的,减少查询数量将是最好的解决方案,但正如我向James Black提到的,我从未尝试过在重复密钥更新时插入,甚至不知道是否可能。我正在考虑将它们结合起来,但我从未尝试过在重复密钥更新时插入。加载数据填充会更快;)