方法 1:
select * from table order by id 制限 m, n;
非常に簡単です。このステートメントの意味は、m+n レコードをクエリし、最初の m レコードを削除し、最後の n レコードを返すことです。確かにクエリでページネーションを実行できますが、MySQL はすべての m+n レコードをスキャンする必要があるため、m が大きくなるほどクエリのパフォーマンスが低下します。
方法 2:
select * from table where id > #max_id# order by id limit n;
このクエリは最後の n レコードも返しますが、方法 1 のように最初の m レコードをスキャンする必要はありません。ただし、各レコードで前のクエリ (前のページ) の最大 ID (または最小 ID) を取得する方が一般的です。クエリその方法。
もちろん、このクエリの問題は、この ID を取得できない可能性があることです。たとえば、現在 3 ページにいて、5 ページのデータをクエリする必要がある場合、機能しません。
方法 3:
方法2では実現できないクロスページクエリを回避するには、方法1を組み合わせる必要があります。
パフォーマンスが必要なため、m はできるだけ小さくする必要があります。たとえば、現在ページ 3 にいる場合、ページあたり 10 個のデータを使用してページ 5 をクエリする必要があり、ページ 3 の最大 ID が #max_id# である場合、次のようになります。
select * from table where id > #max_id# ID 制限 10、10 で並べ替えます。
この方法は方法 2 の問題を部分的に解決しますが、現在 2 ページにいて 1000 ページを確認したい場合、パフォーマンスは依然として低いです。
方法 4:
select * from table as a inner join (id 制限 m, n でテーブルから ID を選択) as b on a.id = b.id order by a.id;
このクエリは方法 1 と同じであり、m の値は非常に大きい可能性がありますが、内部サブクエリはテーブル全体ではなく id フィールドのみをスキャンするため、パフォーマンスは方法 1 よりも優れており、クロスクエリを解決できます。ページクエリの問題。
方法 5:
select * from table where id > (select id from table order by id 制限 m, 1) 制限 n;
このクエリはサブクエリを通じてフィールド ID もスキャンし、その効果は方法 4 と同じです。ただし、方法 5 は、テーブルの関連付けではなく単純な比較を必要とするため、方法 4 よりもパフォーマンスがわずかに優れており、前のページの最大 ID が不明な場合に推奨される使用法です。