Давам много закъсняла актуализация по този въпрос:
Не открих причината, но се оказа, че EXPLAIN е различен в PHP спрямо CLI. Не съм сигурен дали някой аспект на връзката ще накара MySQL да избере да използва различно поле за индекса, защото доколкото знам тези неща не трябва да са свързани; но уви, EXPLAIN на PHP показа, че правилният индекс не се използва, докато CLI го направи.
Решението в този (объркващ) случай е да се използва индексен намек . Вижте реда „ОТ“ в тази модифицирана заявка от моя пример:
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 USE INDEX (created_on)
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;
Надявам се това да помогне на някого!