【问题标题】:Why is mysql only creating temp tables when used with PDO?为什么mysql只在与PDO一起使用时创建临时表?
【发布时间】:2015-02-10 10:14:29
【问题描述】:

我有一个包含三个连接的查询,它返回几百行。当我从命令行运行它时,它始终需要 8 到 9 秒才能完成。但是,当我通过 PDO 运行它时,通常需要大约 2 分 40 秒才能完成。当我在运行时运行“show processlist”时,我发现大部分时间都处于“复制到 tmp 表”状态,这似乎只有在我通过 PDO 运行时才会发生。

总结一下:

<? $pdo->prepare($query)->execute(); ?> => takes 2 minutes 40
$ echo $query | mysql; => takes 8 seconds

这是为什么?这是完全相同的查询;我实际上是在 php 和命令行之间复制和粘贴它。那么,为什么 pdo 需要这么长时间呢?更重要的是,如何在不更改查询的情况下加快执行速度?

【问题讨论】:

  • 你能显示查询吗?
  • 我们需要查询,您是否尝试过解释 PDO 运行的查询和控制台中的查询?
  • 对查询进行解释并粘贴。

标签: php mysql performance pdo command-line-interface


【解决方案1】:

通常,通过 PDO 运行查询会比在本地运行查询要慢。这是因为据我所知,您已经通过使用 PDO 经历了三层(在 PDO 下您获得了 ODBC)。因此,与原生相比,PDO 较慢是正常的。

由于您要比较相同查询的时间,我认为您有很多行。我认为 PDO 无法以与您的本机交付它们的速度相同的速度消耗大量行,从而减慢了进程。

如果您将其与出于某种原因不使用索引结合起来,则时间差会更大。在这方面你可以检查两个连接的字符集是否相同。

【讨论】:

    【解决方案2】:

    使用bindValue() 方法指定确切的参数类型(整数、字符串)。否则Mysql可能不会使用索引。

    看起来类似于question

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2016-03-15
      • 2021-07-18
      • 1970-01-01
      • 2021-09-30
      • 2017-04-09
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多