Uppdatering:
Se den här artikeln i min blogg för en mer detaljerad analys av problemet:
När du utfärdar något som LIMIT 150000, 10
, betyder det att MySQL
ska passera dessa 150,000
registrerar och hitta nästa 10
.
Att gå igenom indexet är långsamt i MySQL
.
Även MySQL
är inte kapabel att göra sena raduppslagningar.
Teoretiskt, om du gör ORDER BY id LIMIT 100000, 10
, det räcker med att använda indexet för att hitta värdena från 100000
till 100010
, leta sedan bara upp 10
rader som uppfyller det indexet och returnerar dem.
Alla större system utom MySQL
är medvetna om det och letar bara upp raderna om värdena verkligen ska returneras.
MySQL
, däremot slår upp varje rad.
Försök att skriva om din fråga så här:
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