Opdatering:
Se denne artikel i min blog for en mere detaljeret analyse af problemet:
Når du udsteder noget som LIMIT 150000, 10
, betyder det, at MySQL
skal krydse disse 150,000
poster og find den næste 10
.
Gennemgangen af indekset er langsom i MySQL
.
Også MySQL
er ikke i stand til at foretage sene rækkeopslag.
Teoretisk set, hvis du gør ORDER BY id LIMIT 100000, 10
, er det nok at bruge indekset til at finde værdierne fra 100000
til 100010
, så slå kun 10
op rækker, der opfylder dette indeks og returnerer dem.
Alle større systemer undtagen MySQL
er opmærksomme på det og slår kun rækkerne op, hvis værdierne virkelig skal returneres.
MySQL
slår dog op i hver række.
Prøv at omskrive din forespørgsel som denne:
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