3

我只是切换到 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 版本 => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
  • 客户端 API 库版本 => 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)) 的查询的缓冲,由于变化的特性和可能的​​副作用,我在生产中无法轻松做到这一点。
4

1 回答 1

0

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

于 2015-06-17T14:51:28.407 回答