I'm just switching to mysqlnd to be able to use http://php.net/manual/en/book.mysqlnd-ms.php but I see some serious performance degradation compared to libmysql.
NewRewlic shows more 100ms spend in PHP after switching to mysqlnd https://db.tt/68r9RfhJ
I've created a benchmark to reproduce the problem, it's quite simple:
$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);
}
Execution time:
- libmysql - ~2 seconds
- mysqlnd - ~3 seconds (50% more)
Version information:
- PHP Version: PHP 5.5.9-1ubuntu4.9
- Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
- Client API library version => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
Can anybody explain me what's the reason behind it and how to solve it?
- Slowness occurs for PDO mainly.
- mysqli doesn't seem to be that much affected.
- I cannot switch to mysqli due to usage of Doctrine.
- Only way to catch up libmysql speed is to disable buffering from queries for MySQL (
setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false)
) which I cannot do easily on production because of character of change and possible side-effects.