Както показахте, MySQL има два алтернативни плана за заявки за заявки с ORDER BY ... LIMIT n
:
- Прочетете всички отговарящи на условията редове, сортирайте ги и изберете n горни редове.
- Прочетете редовете в сортиран ред и спрете, когато n бяха открити отговарящи на изискванията редове.
За да реши кой е по-добрият вариант, оптимизаторът трябва да оцени ефекта на филтриране на вашето WHERE условие. Това не е директно, особено за колони, които не са индексирани, или за колони, където стойностите са корелирани. Във вашия случай вероятно трябва да се прочете много повече от таблицата в сортиран ред, за да се намерят първите 25 отговарящи на изискванията реда, отколкото е очаквал оптимизаторът.
Има няколко подобрения в начина, по който се обработват LIMIT заявки, както в по-късни версии на 5.6 (работите на версия преди GA!), така и в по-нови версии (5.7, 8.0). Предлагам ви да опитате да надстроите до по-късна версия и да видите дали това все още е проблем.
Като цяло, ако искате да разберете решенията за планиране на заявки, трябва да погледнете проследяването на оптимизатора за заявката.