LIMIT、OFFSETとページネーションの基礎
LIMITとOFFSETで大きな結果セットをページ分割し、性能上のトレードオフを理解して、安定したスクロールにキーセットページネーションを使います。
「LIMIT、OFFSETとページネーションの基礎」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
LIMIT:結果件数を制限する
LIMIT nは最大でn行を返します。
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10;OFFSET:先頭のN行をスキップする
OFFSET kは先頭からk行をスキップします。
-- Rows 11–20 (the second page of 10):
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;ページネーション=LIMIT + OFFSET
一般的なページ番号方式は次のとおりです。
-- Page p (1-based), page size s:
SELECT * FROM articles
ORDER BY published_at DESC
LIMIT s OFFSET (p - 1) * s;OFFSETが遅くなる理由
OFFSETでは、スキップするすべての行を内部で読み取ります。
- 10行の1ページ目 → 10行を読み取る
- 10行ずつの1000ページ目 → 10,000行を読み取る
- 1,000,000ページ目 → 1,000万行を読み取る
OFFSETの計算量はO(offset)です。深いページでは実用になりません。
キーセットページネーション(「シーク方式」)
最後に確認したソートキーを記録し、その位置から次のページを取得します。
-- First page:
SELECT * FROM articles
ORDER BY published_at DESC, id DESC
LIMIT 20;
-- Next page — pass the last seen (published_at, id):
SELECT * FROM articles
WHERE (published_at, id) < ($1, $2)
ORDER BY published_at DESC, id DESC
LIMIT 20;キーセットが高速な理由
キーセットページネーションでは、インデックス範囲スキャンを使用します。最後に確認した行の直後まで直接移動し、N行を読み取れば完了します。コストはページの深さに関係なく、O(ページサイズ)です。
ORDER BYなしのLIMITは非決定的
経験則として、LIMITには必ずORDER BYを組み合わせてください。そうしないと、データベースは呼び出しごとに異なる行を返す可能性があります。
-- Wrong — results may vary between runs:
SELECT * FROM events LIMIT 10;
-- Right:
SELECT * FROM events ORDER BY id DESC LIMIT 10;総件数とページネーション
UIでは、合計行数が必要になることがあります。別途COUNT(*)クエリを実行するのが最も簡単ですが、大きなテーブルではコストが高くなる可能性があります。
SELECT COUNT(*) FROM articles WHERE author_id = $1;
-- Alternative for huge tables: estimate from pg_class.reltuples or use approximate counts.FETCH FIRST(標準SQL)
LIMITに相当する標準SQLの構文です。
SELECT * FROM products
ORDER BY id
FETCH FIRST 10 ROWS ONLY;
-- With offset:
-- OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY巨大な結果セットのためのカーソル
数百万行をエクスポートする場合は、LIMIT/OFFSETのループではなく、DBカーソルまたはストリーミング対応のドライバーを使用してください。
BEGIN;
DECLARE big_cursor CURSOR FOR
SELECT * FROM events ORDER BY id;
FETCH 1000 FROM big_cursor;
-- ...
CLOSE big_cursor;
COMMIT;OFFSETを使ってもよい場合
浅いページ(UIの1~10ページ目)や小さなテーブルではOFFSETを使っても問題ありません。深いページネーション、無限スクロール、APIではキーセットページネーションを使用してください。
まとめ
LIMITとOFFSETで結果セットをページネーションできます。
- 必ずORDER BYと組み合わせる
- 深いページではOFFSETが遅くなるため、大きなページではキーセットに切り替える
- FETCH FIRSTは標準SQLでの同等の構文
クイックチェック
大きなテーブルの深い位置までページネーションする場合、最も効率的な方法はどれですか。
よくある質問
「LIMIT、OFFSETとページネーションの基礎」レッスンは無料ですか?
はい。「LIMIT、OFFSETとページネーションの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「LIMIT、OFFSETとページネーションの基礎」で何を学びますか?
LIMITとOFFSETで大きな結果セットをページ分割し、性能上のトレードオフを理解して、安定したスクロールにキーセットページネーションを使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「LIMIT、OFFSETとページネーションの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 列と式の選択
- WHEREフィルター:比較演算子と論理演算子
- 単一列・複数列のORDER BY
- LIMIT、OFFSETとページネーションの基礎