我只是切换到 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 $
谁能解释一下它背后的原因以及如何解决它?
- 缓慢主要发生在 PDO 上。
- mysqli 似乎没有受到太大影响。
- 由于使用了 Doctrine,我无法切换到 mysqli。
- 赶上 libmysql 速度的唯一方法是禁用对 MySQL (
setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false)
) 的查询的缓冲,由于变化的特性和可能的副作用,我在生产中无法轻松做到这一点。