Podajemy bardzo spóźnioną aktualizację tego pytania:
Nie znalazłem przyczyny, ale okazuje się, że EXPLAIN było inne w PHP niż w CLI. Nie jestem pewien, czy jakikolwiek aspekt połączenia spowodowałby, że MySQL wybrałby użycie innego pola dla indeksu, ponieważ o ile wiem, te rzeczy nie powinny być ze sobą powiązane; ale niestety, EXPLAIN PHP pokazał, że właściwy indeks nie był używany, podczas gdy CLI tak.
Rozwiązaniem w tym (zagadkowym) przypadku jest użycie podpowiedzi do indeksu . Zobacz wiersz „FROM” w tym zmodyfikowanym zapytaniu z mojego przykładu:
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;
Mam nadzieję, że to komuś pomoże!