使用PDO

时间:2015-06-17 14:40:03

标签: php mysql pdo libmysql mysqlnd

我只是切换到mysqlnd以便能够使用http://php.net/manual/en/book.mysqlnd-ms.php但是我发现与libmysql相比,性能会有一些严重下降。

NewRewlic在切换到mysqlnd https://db.tt/68r9RfhJ

后显示在PHP上花费了100多分钟

我已经创建了一个基准来重现问题,这很简单:

$dbh = new PDO("mysql:host=$host; dbname=$dbname;", $user, $pass);

for ($i = 0; $i < 1000; $i++) {
    $sth = $dbh->prepare("SELECT * FROM Orders LIMIT 100");
    $sth->execute();

    $result = $sth->fetchAll(PDO::FETCH_ASSOC);
}

执行时间:

  • libmysql - ~2秒
  • mysqlnd - ~3秒(多50%)

版本信息:

  • PHP版本:PHP 5.5.9-1ubuntu4.9
  • 客户端API版本=&gt; mysqlnd 5.0.11-dev - 20120503 - $ Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
  • 客户端API库版本=&gt; mysqlnd 5.0.11-dev - 20120503 - $ Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $

任何人都能解释一下它背后的原因是什么以及如何解决它?

  1. 主要是PDO发生缓慢。
  2. mysqli似乎并未受到太大影响。
  3. 由于使用了Doctrine,我无法切换到mysqli。
  4. 只有这样才能赶上libmysql的速度是禁用MySQL查询(setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false))的缓冲,由于变化的特点和可能​​的副作用,我无法在生产中轻松完成。

1 个答案:

答案 0 :(得分:0)

mysqlnd并不慢。它在内存上效率更高。 PHP不是通过复制所有数据从mysql中获取结果,而是成为与mysql对话并将数据存储在内存中的相同过程。因此,您最终使用了一半的内存,但增加的计算成本可能是必须在PHP进程中分配该内存。你可能只是看到了从newql到mysql的转变。我非常怀疑你在这方面的表现有什么值得关注的。