Effizientes Paging in SQLite mit Millionen von Datensätzen

102

Ich muss die SQLite-Ergebnisse in einer Listenansicht anzeigen. Natürlich muss ich die Ergebnisse paginieren.

Die erste Option ist die Verwendung der LIMIT-Klausel. Beispielsweise:

SELECT * FROM Table LIMIT 100, 5000

Es gibt die Datensätze 5001 bis 5100 zurück. Das Problem ist, dass SQLite intern die ersten 5000 Datensätze "liest" und nicht zu effizient ist.

Was ist der beste Ansatz für das Paging, wenn viele Datensätze vorhanden sind?

Dabiel Kabuto
quelle

Antworten:

118

Bitte beachten Sie, dass Sie immer eine ORDER BYKlausel verwenden müssen; Andernfalls ist die Reihenfolge beliebig.

Um ein effizientes Paging durchzuführen, speichern Sie die ersten / zuletzt angezeigten Werte der geordneten Felder und fahren Sie unmittelbar danach fort, wenn Sie die nächste Seite anzeigen:

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

(Dies wird im SQLite-Wiki ausführlicher erklärt .)

Wenn Sie mehrere Sortierspalten haben (und SQLite 3.15 oder höher), können Sie hierfür einen Zeilenwertvergleich verwenden :

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;
CL.
quelle
8
Was ist mit einem Fall, in dem Sie in SomeColumn 101 identische Werte haben? Dies scheint besser zu sein: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz
6
@ JacekŁawrynowicz Wenn die Sortierspalte nicht eindeutig ist, müssen Sie nach mehreren Spalten sortieren. Wenn Sie eine alternative Antwort haben, erstellen Sie eine Antwort.
CL.
@CL, wenn ich dies mit Join-Abfrage tun möchte, wie mit mehreren UND-Bedingungen zu tun ist
YLS
@YLS Heutzutage können Sie Zeilenwerte verwenden.
CL.
2
Das Problem mit diesem Ansatz wird kurz durch diesen Kommentar erklärt
mr5