コマンドライン PHP スクリプト (mysqlnd ドライバーで PDO を使用して準備されたクエリ) を介して MySQL クエリを実行しています。これは、左結合が 1 つの単純なクエリで、1 行あたり 100 行と 7 つの小さな列を返します。
このクエリを MySQL CLI で (問題の PHP スクリプトを実行している同じマシンで) 実行すると、SQL_NO_CACHE フラグがスローされていても、0.10 秒かかります。
このクエリを準備して PDO で実行すると、9 秒以上かかります。これは execute()のみです。フェッチ呼び出しにかかる時間は含まれません。
私のクエリの例:
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クライアントがほぼ瞬時に実行されたことを考えると、クエリに問題があるとは思いませんが、キックのEXPLAINは次のとおりです。
+----+-------------+-------+--------+-------------------------+------------+---------+-----------------------------------+------+-------------+
| 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 秒かかっているのは一体何なのでしょうか?
編集:コメントで述べたように、これの mysql_query バージョンも作成しましたが、パフォーマンスは同じです。ただし、WHERE 句の一部を削除すると、MySQL クライアントと同じくらい高速に実行されます。気が遠くなるような詳細を読んでください。