PostgreSQL でのページネーションの最適化: OFFSET のパフォーマンスの問題を克服する戦略
大規模な PostgreSQL テーブルで OFFSET
を使用すると、パフォーマンスの問題が発生することがよくあります。 ページネーションの効率を向上させる効果的な戦略は次のとおりです:
キーセットのページネーション: 行値の比較を利用する
OFFSET
に依存する代わりに、行値の比較を利用して、より効率的な行スキップを行います。これには、関連する列でテーブルを並べ替え、前のページの最後の行の値を次のページのクエリの開始点として使用することが含まれます。
<code class="language-sql">SELECT * FROM big_table WHERE (vote, id) > (vote_x, id_x) -- Row value comparison ORDER BY vote, id LIMIT n;</code>
このメソッドは、(vote, id)
のインデックスを効率的に使用して結果をフィルタリングします。
インデックス付き行番号アプローチ (読み取り負荷の高いワークロード)
主に読み取りに使用されるテーブルの場合、インデックス付きの行番号列を追加すると、行をスキップする直接的な方法が提供され、OFFSET
が不要になります。 注: これは、頻繁に更新されるテーブルには理想的ではありません。
<code class="language-sql">ALTER TABLE big_table ADD COLUMN row_number INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY; SELECT * FROM big_table WHERE row_number > x LIMIT n;</code>
重要な考慮事項:
ORDER BY
句がページネーションの方向と一致していることを確認します。NULL
制約または NOT NULL
を使用して NULLS FIRST/LAST
値に対処します。以上がOFFSET のボトルネックを回避するために、大きなテーブルの PostgreSQL でページネーションを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。