php - mysqlnd 明显比使用 PDO 的 libmysql 慢

标签 php mysql pdo libmysql mysqlnd

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

NewRewlic 显示切换到 mysqlnd 后 PHP 花费了更多 100 毫秒 https://db.tt/68r9RfhJ

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

$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. catch libmysql 速度的唯一方法是禁用 MySQL 查询的缓冲 (setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false)) 由于变化的特性和可能的​​特性,我无法在生产中轻易做到这一点副作用。

最佳答案

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

关于php - mysqlnd 明显比使用 PDO 的 libmysql 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894833/

相关文章:

php - MySQL 左连接 - 右侧不重复

php - 使用 php 脚本和连接检查外部服务器数据库的可用性

mysql - 非顺序(例如,UUID/GUID)数据如何降低索引性能?

php - 图片上传,ajax,php,mysql

php - PDO查询未将数据插入MySQL数据库,未显示任何错误

php - PDOException 在 Zend Framework 2 + Doctrine 上找不到驱动程序

php - 我正在努力使用 PDO 升级登录脚本

php - $_SESSION 变量不会取值

php - Wordpress 菜单选择状态

php - 从一行中返回具有多个值的单个 MySQL 结果