Giver en meget forsinket opdatering på dette spørgsmål:
Jeg har ikke fundet årsagen, men det viser sig, at EXPLAIN var anderledes i PHP og på CLI. Jeg er ikke sikker på, om noget aspekt af forbindelsen ville få MySQL til at vælge at bruge et andet felt til indekset, for så vidt jeg ved, burde disse ting ikke være relateret; men desværre, PHP's EXPLAIN viste, at det korrekte indeks ikke blev brugt, mens CLI'erne gjorde det.
Løsningen i dette (forvirrende) tilfælde er at bruge indekshint . Se 'FRA'-linjen i denne ændrede forespørgsel fra mit eksempel:
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;
Håber dette hjælper nogen!