इस सवाल पर बहुत देर से अपडेट दे रहा हूं:
मुझे कारण नहीं मिला है, लेकिन यह पता चला है कि सीएलआई बनाम PHP में EXPLAIN अलग था। मुझे यकीन नहीं है कि कनेक्शन का कोई पहलू MySQL को इंडेक्स के लिए एक अलग फ़ील्ड का उपयोग करने का कारण बनता है, क्योंकि जहां तक मुझे पता है कि उन चीजों से संबंधित नहीं होना चाहिए; लेकिन अफसोस, PHP के EXPLAIN ने दिखाया कि उचित अनुक्रमणिका का उपयोग नहीं किया जा रहा था, जबकि CLI ने किया था।
इस (चकित) मामले में समाधान इंडेक्स हिंटिंग का उपयोग करना है। . मेरे उदाहरण से इस संशोधित क्वेरी में 'FROM' लाइन देखें:
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;
आशा है कि यह किसी की मदद करेगा!