Pagination efficace dans SQLite avec des millions d'enregistrements


102

J'ai besoin d'afficher les résultats 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 que SQLite "lit" en interne les 5 000 premiers enregistrements et ce n'est pas trop efficace.

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

Réponses:


118

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

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

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

(Ceci est expliqué plus en détail sur le wiki SQLite .)

Lorsque vous avez plusieurs colonnes de tri (et SQLite 3.15 ou version ultérieure), vous pouvez utiliser une comparaison de valeur de ligne pour cela:

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

8
Qu'en est-il d'un cas où vous avez 101 valeurs identiques dans SomeColumn? Cela semble être mieux: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz

6
@ JacekŁawrynowicz Si la colonne de tri n'est pas unique, vous devez trier par plus de colonnes. Quoi qu'il en soit, si vous avez une autre réponse, créez une réponse.
CL.

@CL si je veux faire cela avec une requête de jointure comment faire avec plusieurs conditions AND
YLS

@YLS De nos jours, vous pouvez utiliser des valeurs de ligne.
CL.

2
Le problème avec cette approche est brièvement expliqué par ce commentaire
mr5
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.