Jak pokazałeś, MySQL ma dwa alternatywne plany zapytań dla zapytań z ORDER BY ... LIMIT n
:
- Przeczytaj wszystkie kwalifikujące się wiersze, posortuj je i wybierz n górne rzędy.
- Przeczytaj wiersze w kolejności posortowanej i zatrzymaj się, gdy n znaleziono kwalifikujące się wiersze.
Aby zdecydować, która opcja jest lepsza, optymalizator musi oszacować efekt filtrowania warunku WHERE. Nie jest to proste, szczególnie w przypadku kolumn, które nie są indeksowane lub w przypadku kolumn, w których wartości są skorelowane. W twoim przypadku prawdopodobnie trzeba przeczytać o wiele więcej tabeli w posortowanej kolejności, aby znaleźć pierwszych 25 kwalifikujących się wierszy, niż oczekiwał optymalizator.
Wprowadzono kilka ulepszeń w sposobie obsługi zapytań LIMIT, zarówno w nowszych wersjach 5.6 (używasz wersji przed GA!), jak i nowszych (5.7, 8.0). Proponuję spróbować uaktualnić do nowszej wersji i sprawdzić, czy to nadal stanowi problem.
Ogólnie rzecz biorąc, jeśli chcesz zrozumieć decyzje planisty zapytań, powinieneś przyjrzeć się śladowi optymalizatora dla zapytania.