我只是切换到 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 $
谁能解释一下它背后的原因是什么以及如何解决它?
- 缓慢主要发生在 PDO 上。
- mysqli 似乎没有受到太大影响。
- 由于使用了 Doctrine,我无法切换到 mysqli。
- 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/