代码之家  ›  专栏  ›  技术社区  ›  jeroen

pdo/php/mysql中的性能:事务与直接执行

  •  5
  • jeroen  · 技术社区  · 15 年前

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

    与循环内的直接执行相比,在循环结束后使用事务提交是否有好处?

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Pascal MARTIN    15 年前

    如果您的查询是插入的,则页面 7.2.19. Speed of INSERT Statements 根据您是否使用事务处理引擎,mysql手册提供了两个有趣的信息:

    使用非事务处理引擎时:

    加速插入操作 用多个语句执行 非事务性表,锁定 桌子。

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

    并且,使用事务处理引擎:

    为了获得更快的插入 事务表,应使用 启动事务并提交 锁表。

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

    我链接到的页面上有更多信息,因此请毫不犹豫地阅读;-)


    如果你这样做的话 update statements :

    另一种快速更新的方法是 延迟更新,然后执行许多更新 一排接一排。执行多个 一起更新比 如果您锁定 表。

    所以,我猜,插入物也可以这么说。


    顺便说一句:当然,你可以尝试这两种解决方案,用基准测试它们 microtime 例如,在PHP方面;-)

        2
  •  3
  •   James Black    15 年前

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

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

    一个事务会让你慢下来,所以如果你不需要它,那么就不要使用它。

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

        3
  •  3
  •   flm    11 年前

    当我必须实现一个csv文件(可能很长)数据导入(我知道您可以使用 LOAD DATA INFILE 语法,但是在插入之前,我必须对字段应用一些处理)。

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