Aktualizacja:
Zobacz ten artykuł na moim blogu, aby uzyskać bardziej szczegółową analizę problemu:
Kiedy wydajesz coś takiego jak LIMIT 150000, 10
, oznacza to, że MySQL
powinien przejść przez te 150,000
rekordy i znajdź następne 10
.
Przemierzanie indeksu jest powolne w MySQL
.
Również MySQL
nie jest zdolny do wyszukiwania późnych wierszy.
Teoretycznie, jeśli zrobisz ORDER BY id LIMIT 100000, 10
, wystarczy użyć indeksu, aby znaleźć wartości z 100000
do 100010
, a następnie wyszukaj tylko 10
wiersze, które spełniają ten indeks i zwracają je.
Wszystkie główne systemy z wyjątkiem MySQL
są tego świadomi i sprawdzają wiersze tylko wtedy, gdy wartości rzeczywiście mają zostać zwrócone.
MySQL
jednak sprawdza każdy wiersz.
Spróbuj przepisać zapytanie w ten sposób:
SELECT news.*
FROM (
SELECT id
FROM news
WHERE cat_id='4'
ORDER BY
id DESC
LIMIT 150000, 10
) o
JOIN news
ON news.id = o.id