127 votes

Pagination efficace dans SQLite avec des millions d'enregistrements

J'ai besoin de montrer les résultats de SQLite dans une vue de liste. Bien sûr, j'ai besoin de paginer les résultats.

La première option consiste à utiliser la clause LIMIT. Par exemple :

SELECT * FROM Table LIMIT 100, 5000

Il renvoie les enregistrements 5001 à 5100. Le problème est qu'en interne, SQLite "lit" les 5000 premiers enregistrements et ce n'est pas très efficace.

Quelle est la meilleure approche pour la pagination lorsqu'il y a beaucoup d'enregistrements ?

151voto

CL. Points 46451

Veuillez noter que vous devez toujours utiliser un ORDER BY sinon, l'ordre est arbitraire.

Pour effectuer une pagination efficace, enregistrez les premières/dernières valeurs affichées du ou des champs ordonnés, et continuez juste après lors de l'affichage de la page suivante :

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(Ceci est expliqué avec plus de détails sur le wiki SQLite .)

Lorsque vous avez plusieurs colonnes de tri (et SQLite 3.15 ou ultérieur), vous pouvez utiliser un fichier comparaison des valeurs des lignes pour ça :

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X