PHP braucht 90x länger als der MySQL-Client, um die Abfrage auszuführen

Ich führe eine MySQL-Abfrage über ein PHP-Befehlszeilenskript aus (vorbereitete Abfrage mit PDO auf dem mysqlnd-Treiber). Es ist eine einfache Abfrage mit einem einzelnen Links-Join, die 100 Zeilen und 7 kleine Spalten pro Zeile zurückgibt.

Wenn ich diese Abfrage in der MySQL-CLI (auf demselben Computer, auf dem das betreffende PHP-Skript ausgeführt wird) ausführe, dauert es 0,10 Sekunden - auch wenn das SQL_NO_CACHE-Flag aktiviert ist.

Wenn ich diese vorbereitete Abfrage über PDO ausführe, dauert es mehr als 9 Sekunden. Dies ist execute ()nur - ohne die Zeit, die für den Abruf benötigt wird.

Ein Beispiel für meine Anfrage:

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;

Ich glaube nicht, dass die Abfrage fehlerhaft ist, wenn man bedenkt, dass jeder native MySQL-Client, den ich ausprobiert habe, sie fast sofort ausführt.

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

Was in aller Welt macht PDO, das 8,9 Sekunden dauert?

BEARBEITEN: Wie in den Kommentaren angegeben, habe ich auch eine mysql_query-Version davon geschrieben, und sie hat die gleiche schlechte Leistung. Durch das Entfernen eines Teils der WHERE-Klausel wird diese jedoch genauso schnell ausgeführt wie der MySQL-Client. Lesen Sie weiter für verblüffende Details.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage