Memberikan pembaruan yang sangat terlambat untuk pertanyaan ini:
Saya belum menemukan penyebabnya, tapi ternyata EXPLAIN di PHP berbeda dengan di CLI. Saya tidak yakin apakah ada aspek koneksi yang akan menyebabkan MySQL memilih untuk menggunakan bidang yang berbeda untuk indeks, karena sejauh yang saya tahu hal-hal itu seharusnya tidak terkait; tapi sayangnya, EXPLAIN PHP menunjukkan bahwa indeks yang tepat tidak digunakan, sedangkan CLI melakukannya.
Solusi dalam kasus (membingungkan) ini adalah dengan menggunakan petunjuk indeks . Lihat baris 'FROM' dalam kueri yang dimodifikasi ini dari contoh saya:
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;
Semoga ini bisa membantu seseorang!