オフセットとカーソルのページネーションの説明


通常、データベースを持つアプリケーションでは、ページから、またはクエリから単一の結果セットに収まることができますよりも多くのレコードがあります.ユーザーまたはユーザーが結果の次のページを取得したい場合は、次の2つのオプションを指定します
  • オフセットページパス
  • カーソルページ

  • オフセットページパス
    オフセットのページネーションを使用してデータを取得する場合、クライアントは通常、クライアントに2つの追加パラメータをクエリに設定できます.
    オフセットは、単にレコードを選択する前にスキップしたいレコードの数です.これは、データベースがまだデータを選択し始める場所を知るために、行のオフセット数を読み取る必要があるため、レコード数が増加するにつれて遅くなります.これはしばしばO(n) 複雑さ、一般的に最悪のシナリオです.さらに、頻繁に書き込みを行う大規模なデータベースの典型的なように頻繁に変更するデータセットでは、結果のウィンドウは、結果が完全に失敗するか、または結果が現在の前のページに追加されているため、重複を参照してくださいという点で異なるページ間で不正確になることがあります.
    データベースから最新の記事の最初のページを取得したい場合は、次のようになります.
    Post
    |> order_by(inserted_at: :desc)
    |> limit(20)
    
    そして、2ページ目の結果が欲しい場合、オフセットを含めることができます.
    Post
    |> order_by(inserted_at: :desc)
    |> limit(20)
    |> offset(20)
    
    あなたが最初にこのメソッドを取得することができますが、それは間違いなく最初に行う価値がある-レコードの数が増加するように、あなたははるかに速く、より正確に読んでするための選択肢を検討することができます.

    カーソルページ
    これは、カーソルベースのページ化が来るところです.カーソルは、特定のレコードの一意の識別子で、結果の次のページを取得するクエリを開始する次のレコードへのポインタとして機能します.カーソルを使用すると、既に使用している行を読み取る必要がありますWHERE 我々の問合せの節(それが一定の状態でデータを読むのを速くすること).O(1) 時間の複雑さと私たちは、同じ位置のままで記録の位置に頼るよりむしろ特定の行の後、常に読むことによって不正確な結果の問題に対処します.
    前回の例を使用していますが、今回はカーソルでページ付けを実装しました.
    Post
    |> order_by(inserted_at: :desc)
    |> limit(20)
    |> where([p], p.id < ^cursor)
    
    カーソルを使用するには、結果セットの最後の項目のカーソルに加えて、最初のページから結果を返す必要があります.この方法でカーソルを使用すると、結果セットで前方に移動するための罰金ですが、取得方向を変更することで、レコードを取得する方法に複雑さを追加できます.

    結論
    カーソルのページが最も頻繁に新しいレコードが追加され、データを読むときに頻繁に最新の結果を最初に表示されるため、リアルタイムのデータに使用されます.それがデータ自体に依存し、どのように頻繁に新しいレコードが追加されるように、オフセットとカーソルのページネーションが最も意味をなす異なるシナリオがあります.静的データを問い合わせる場合、パフォーマンスコストはカーソルを使用するのに十分ではないかもしれません.