PHP выполняет запрос в 90 раз дольше, чем клиент MySQL
Я выполняю запрос MySQL через PHP-скрипт командной строки (подготовленный запрос с использованием PDO в драйвере mysqlnd). Это простой запрос с одним левым соединением, возвращающий 100 строк и 7 маленьких столбцов на строку.
Когда я выполняю этот запрос в интерфейсе командной строки MySQL (на том же компьютере, на котором выполняется рассматриваемый PHP-скрипт), он занимает 0,10 секунды - даже с добавленным флагом SQL_NO_CACHE.
Когда я запускаю этот запрос, подготовленный через PDO, он занимает более 9 секунд. Это выполнить ()only - не включая время, необходимое для вызова извлечения.
Пример моего запроса:
SELECT HEX(al.uuid) hexUUID, al.created_on,
IFNULL(al.state, 'ON') actionType, pp.publishers_id publisher_id,
pp.products_id product_id, al.action_id, al.last_updated
FROM ActionAPI.actionLists al
LEFT JOIN ActionAPI.publishers_products pp
ON al.publisher_product_id = pp.id
WHERE (al.test IS NULL OR al.test = 0)
AND (al.created_on >= :since OR al.last_updated >= :since)
ORDER BY created_on ASC
LIMIT :skip, 100;
Я не верю, что запрос ошибочен, учитывая, что каждый собственный клиент MySQL, который я пробовал, запускал его почти мгновенно, но вот ОБЪЯСНЕНИЕ для пинков:
+----+-------------+-------+--------+-------------------------+------------+---------+-----------------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------+------------+---------+-----------------------------------+------+-------------+
| 1 | SIMPLE | al | index | created_on,last_updated | created_on | 8 | NULL | 100 | Using where |
| 1 | SIMPLE | pp | eq_ref | PRIMARY | PRIMARY | 4 | ActionAPI.al.publisher_product_id | 1 | |
+----+-------------+-------+--------+-------------------------+------------+---------+-----------------------------------+------+-------------+
2 rows in set (0.00 sec)
Что в мире делает PDO, что занимает 8,9 секунды?
EDIT: Как указано в комментариях, я также написал версию mysql_query, и она имеет такую же низкую производительность. Однако удаление части предложения WHERE делает его работающим так же быстро, как и клиент MySQL. Продолжайте читать для ошеломляющих деталей.