Đưa ra một cập nhật rất muộn về câu hỏi này:
Tôi chưa tìm ra nguyên nhân, nhưng hóa ra GIẢI THÍCH trong PHP khác với CLI. Tôi không chắc liệu có bất kỳ khía cạnh nào của kết nối khiến MySQL chọn sử dụng một trường khác cho chỉ mục hay không, vì theo như tôi biết thì những thứ đó không nên liên quan; nhưng than ôi, GIẢI THÍCH của PHP cho thấy rằng chỉ mục thích hợp đã không được sử dụng, trong khi CLI thì có.
Giải pháp trong trường hợp này (gây xáo trộn) là sử dụng gợi ý chỉ mục . Xem dòng 'TỪ' trong truy vấn đã sửa đổi này từ ví dụ của tôi:
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;
Hy vọng điều này sẽ giúp ai đó!