大きなテーブルでの OFFSET による PostgreSQL クエリのパフォーマンスの向上
PostgreSQL で OFFSET
句を使用して大きなテーブルを処理すると、重大なパフォーマンスのボトルネックが発生する可能性があります。 このようなクエリに対する PostgreSQL の組み込みの最適化には限界があるため、代替戦略が必要です。
インデックス作成と行番号付けの活用
ORDER BY
句 (vote
や id
など) で使用される列のインデックス付けによりパフォーマンスがある程度向上しますが、実質的な OFFSET
値は、オフセットの前に行をスキャンしてカウントする必要があるため、依然として遅延が発生します。 。 代わりに、インデックス付き row_number
列を追加することもできます。これにより、WHERE
の代わりに WHERE row_number > x
句 (OFFSET x
) を使用して行を効率的にスキップできます。 ただし、データが頻繁に変更されるテーブルで行番号を維持することには課題があり、このアプローチは主に読み取り専用のデータセットに適しています。
行値比較による効率的なキーセットのページネーション
優れた方法では、キーセットのページネーションに行値の比較を使用します。 OFFSET
の代わりに、関連する列 (vote
と id
) によってクエリを順序付けし、行値の比較を使用して範囲を定義します。 これは既存の vote_order_asc
(または desc
) インデックスを利用します。 値が最後にフェッチされた行を超えるか下回る行を取得することにより、先行するすべての行をスキャンすることなく、効率的なデータ ナビゲーションが実現されます。
例:
<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)
の組み合わせの一意性を確保します。ORDER BY
句と行値の比較で一貫した順序付けの方向を維持します。NULL
または NULLS FIRST
の動作を考慮して NULLS LAST
値を考慮するか、NOT NULL
列を利用します。これらの手法を採用すると、大規模な PostgreSQL テーブルで OFFSET
を利用するクエリのパフォーマンスを大幅に向上させることができます。
以上が大きなテーブルで OFFSET を使用して PostgreSQL クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。