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

Posted

技术标签:

【中文标题】PDO / PHP / MySQL 中的性能:事务与直接执行【英文标题】:Performance in PDO / PHP / MySQL: transaction versus direct execution 【发布时间】:2010-11-27 18:52:58 【问题描述】:

我正在循环多个值(例如 1 到 100)并在循环内执行准备好的语句。

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

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

【问题讨论】:

【参考方案1】:

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

使用非事务引擎时:

加快 INSERT 操作 用多个语句执行 非事务性表,锁定您的 表格。

这有利于性能,因为 索引缓冲区仅刷新到磁盘 一次,在所有 INSERT 语句都有 完全的。通常情况下,会有 许多索引缓冲区刷新,因为有 插入语句。显式锁定 如果可以的话,不需要声明 使用单个 INSERT 插入所有行。

并且,使用事务引擎:

为了获得更快的插入 事务表,您应该使用 开始交易并提交 锁表。

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

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

而且,如果你在做update statements:

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

所以,我猜与插入相同。

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

【讨论】:

非常感谢您提供的信息,我想我只需要尝试和基准测试。 我想是的 ^^ 让我们知道结果 ;-) 它可能会让其他人感兴趣!而且,顺便说一句:另一种解决方案是使用一个插入查询同时执行多个插入,从而减少查询的总数——编码有点困难,但我已经看到了很大的改进,因为这意味着更少从一台服务器到另一台服务器的调用。 是的,减少查询的数量将是最好的解决方案,但就像我对 James Black 提到的那样,我从未尝试过使用 INSERT ON DUPLICATE KEY UPDATE,甚至不知道它是否有可能。【参考方案2】:

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

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

交易会拖慢你的速度,所以如果你不需要它就不要使用它。

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

【讨论】:

我正在考虑将它们结合起来,但我从未尝试过使用 INSERT ON DUPLICATE KEY UPDATE。【参考方案3】:

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

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

【讨论】:

使用 LOAD DATA INFILE 会更快;)

以上是关于PDO / PHP / MySQL 中的性能:事务与直接执行的主要内容,如果未能解决你的问题,请参考以下文章

PDO中的事务处理

事务、存储过程和 PDO

PHP PDO - 没有活动事务

关于更新事务的 PHP PDO 选择的说明

PHP PDO 事务?

PHP操作PDO预处理以及事务