Mise à jour :
Voir cet article sur mon blog pour une analyse plus détaillée du problème :
Lorsque vous émettez quelque chose comme LIMIT 150000, 10
, cela signifie que MySQL
devrait parcourir ces 150,000
enregistre et trouve le prochain 10
.
La traversée de l'index est lente dans MySQL
.
Aussi, MySQL
n'est pas capable d'effectuer des recherches de lignes tardives.
Théoriquement, si vous faites ORDER BY id LIMIT 100000, 10
, il suffit d'utiliser l'index pour trouver les valeurs à partir de 100000
à 100010
, puis recherchez uniquement 10
lignes qui satisfont cet index et les renvoient.
Tous les principaux systèmes sauf MySQL
en sont conscients et ne consultent les lignes que si les valeurs doivent vraiment être renvoyées.
MySQL
, cependant, recherche chaque ligne.
Essayez de reformuler votre requête comme suit :
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