何百万ものレコードを含むSQLiteでの効率的なページング


102

SQLiteの結果をリストビューで表示する必要があります。もちろん、結果をページングする必要があります。

最初のオプションは、LIMIT句を使用することです。例えば:

SELECT * FROM Table LIMIT 100, 5000

5001から5100のレコードを返します。問題は、SQLiteが内部で最初の5000レコードを「読み取る」ことであり、あまり効率的ではありません。

レコードが多い場合のページングの最良の方法は何ですか?

回答:


118

常にORDER BY句を使用する必要があることに注意してください。それ以外の場合、順序は任意です。

効率的なページングを行うには、順序付けられたフィールドの最初/最後に表示された値を保存し、次のページを表示するときにそれらの直後に進みます。

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

(これについては、SQLite wikiで詳しく説明しています。)

複数のソート列がある場合(およびSQLite 3.15以降)、これに行値の比較を使用できます。

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

8
SomeColumnに101個の同じ値がある場合はどうでしょうか?:これは良いと思わblog.ssokolow.com/archives/2009/12/23/...
ヤツェクŁawrynowicz

6
@JacekŁawrynowiczソート列が一意でない場合は、さらに列でソートする必要があります。とにかく、別の答えがある場合は、答えを作成します。
CL。

@CL結合クエリでこれを行う場合は、複数のAND条件を使用する方法
YLS

@YLS最近では、行の値を使用できます。
CL。

2
このアプローチを使用した問題は、このコメントで
mr5 '30
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.