単純に聞こえますが、これで最高のパフォーマンスを実現するのは難しいことです。いずれにせよ、データベースに作業を任せる必要があります。これは、クライアント側ですべての行をフェッチしてフィルター/ソートするよりも桁違いに高速です。
「前」と「後」が小さい/大きいを意味comment.id
し、ID スペースにギャップがある可能性があるとさらに想定している場合、この1 つのクエリですべてを実行する必要があります。
WITH x AS (SELECT id, group_id FROM comment WHERE id = 26) -- enter value once
(
SELECT *
FROM x
JOIN comment c USING (group_id)
WHERE c.id > x.id
ORDER BY c.id
LIMIT 10
)
UNION ALL
(
SELECT *
FROM x
JOIN comment c USING (group_id)
WHERE c.id < x.id
ORDER BY c.id DESC
LIMIT 10
)
Ruby 構文での言い換えはお任せしますが、それは私の専門分野ではありません。
前の 10 個のコメントと後の 10 個のコメントを返します。存在しない場合は少なくなります。<=
クエリの 2 番目のレグで使用してUNION ALL
、選択したコメント自体を含めます。
行を並べ替える必要がある場合は、上に別のクエリ レベルを追加しますORDER BY
。
テーブルの次の 2 つのインデックスと組み合わせると、非常に高速になるはずですcomment
。
- 1 つ
(id)
- おそらく自動的に主キーがカバーされます。
- ワンオン
(group_id, id)
読み取り専用データの場合、これをさらに高速化するギャップのない行番号を持つマテリアライズド ビューを作成できます。
この密接に関連する回答で、括弧、インデックス、およびパフォーマンスに関する詳細な説明。