オフセットを使用したLIMITは、ほとんどのデータベースで非常に低速です(一部 ドキュメント MySQLのこの効果に、私はSQLiteのこれを説明する少し前に読んだ本当に良い記事を見つけようとしています)。その理由は、一般的に次のように実装されているためです。
-
LIMIT
のように、すべての通常のクエリプランニングを実行します 条項がありませんでした - 目的のインデックスに到達するまで結果をウォークスルーします
- 結果の返送を開始する
LIMIT 10000, 10
を実行した場合、これはどういう意味ですか 、次のように解釈されます:
- 最初の10,000件の結果を取得し、無視します
- 次の10件の結果を提供します
値を気にしないため、少なくとも最初の10,000件の結果のインデックスを使用できる簡単な最適化がありますが、その場合でも、データベースは10件の結果を提供する前に10,000件のインデックス値をウォークスルーする必要があります。これを改善できるさらなる最適化があるかもしれませんが、一般的なケースでは LIMIT
を使用したくありません 大きな値の場合はオフセット付き 。
私が知っているページ付けを処理する最も効率的な方法は、最後のインデックスを追跡することです。したがって、ページ1がid = 5
で終了する場合 、次に次へ リンクにはWHERE id > 5
があります (LIMIT x
を使用 もちろん)。
編集:SQLiteの記事 を見つけました 。 SQLで物事を行うためのRightWay™について説明しているので、これを読むことを強くお勧めします。 SQLiteの人々は本当に賢いので 他のデータベースにも同じ問題があります。MySQLがこれを同様の方法で実装していると思います。