キーセット ページネーション: 効率的なデータベース ページネーションのための OFFSET の優れた代替手段
大規模なデータセットを処理するには、多くの場合、効率的なページネーションが必要です。 OFFSET は一般的なアプローチですが、パフォーマンスの制限があります。この記事では、より効率的で堅牢なソリューションとしてキーセットのページネーションに焦点を当てています。
キーセットのページネーションが OFFSET よりも優先される理由
OFFSET ベースのページネーション (行セット ページネーション) では、目的のページに先行するすべての行を読み取る必要があります。 ただし、キーセットのページネーションでは、インデックスを使用してターゲット行に直接アクセスし、不要なデータの取得をバイパスします。 この最適化により、パフォーマンスが大幅に向上し、OFFSET に固有の「行の欠落」問題が解消されます。 キーセットのページネーションは、不変のキーに依存することでデータの一貫性を保証します。
実際の実装
「Id」でインデックス付けされた「TableName」テーブルを例に挙げてみましょう。レコードの最初のセットを取得するには:
<code class="language-sql">SELECT TOP (@numRows) * FROM TableName ORDER BY Id DESC;</code>
後続のページは、前のクエリの最後の「Id」値を使用して取得されます:
<code class="language-sql">SELECT TOP (@numRows) * FROM TableName WHERE Id < @lastId ORDER BY Id DESC;</code>
インデックスの効率的な使用に注目してください。
重要な考慮事項
効果的なキーセットのページネーションには一意のインデックスが必要です。 ページネーションが一意でない列に依存している場合は、一意性を確保するために ORDER BY
句と WHERE
句の両方に追加の列を含めます。
SQL Server の制限により、もう少し複雑なクエリが必要になります。
<code class="language-sql">SELECT TOP (@numRows) * FROM TableName WHERE ((OtherColumn = @lastOther AND Id < @lastId) OR OtherColumn < @lastOther) ORDER BY OtherColumn DESC, Id DESC;</code>
NULL 値の処理には細心の注意が必要であり、場合によっては別のクエリが必要になります。
要約
キーセットのページネーションは、OFFSET に比べてパフォーマンスに大きな利点をもたらします。インデックスを活用することで、不必要なデータの処理が回避され、非常に大規模なデータセットであっても効率的なページ分割が行われます。 適切な計画とエッジ ケースの考慮により、キーセット ページネーションは、大規模なデータ ストアをナビゲートするための信頼性の高い高性能ソリューションを提供します。
以上がデータベースのページネーションでは、キーセットのページネーションが OFFSET よりも効率的であるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。