PHP potrzebuje 90 razy dłuższego czasu na uruchomienie zapytania niż klient MySQL

Uruchamiam zapytanie MySQL za pomocą skryptu PHP w wierszu poleceń (przygotowane zapytanie przy użyciu PDO w sterowniku mysqlnd). Jest to proste zapytanie z pojedynczym połączeniem lewym, zwracającym 100 wierszy i 7 małych kolumn w wierszu.

Gdy uruchomię to zapytanie w interfejsie MySQL CLI (na tej samej maszynie, na której uruchamiany jest dany skrypt PHP), zajmuje to 0,10 sekundy - nawet z flagą SQL_NO_CACHE wrzuconą.

Po uruchomieniu tego zapytania, przygotowanego przez PDO, trwa ponad 9 sekund. To jest execute ()tylko - nie wliczając czasu potrzebnego na wywołanie pobierania.

Przykład mojego zapytania:

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;

Nie wierzę, że błąd jest błędny, biorąc pod uwagę, że każdy natywny klient MySQL uruchomił go niemal natychmiast, ale oto EXPLAIN dla kopnięć:

+----+-------------+-------+--------+-------------------------+------------+---------+-----------------------------------+------+-------------+
| 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)

Co na świecie robi PDO trwające 8,9 sekundy?

EDYTOWAĆ: Jak stwierdzono w komentarzach, napisałem również wersję mysql_query, która ma tę samą słabą wydajność. Usunięcie części klauzuli WHERE powoduje jednak, że działa tak szybko, jak klient MySQL. Czytaj dalej, aby uzyskać zadziwiające szczegóły.

questionAnswers(4)

yourAnswerToTheQuestion