MySQLを利用したページングを実装しています。

大規模なデータを利用しているためフルスキャン対策として、Limit Offsetを利用したページングは避け、Where句、Between句を利用したページングでパフォーマンスを担保しています。

http://blog.yappo.jp/yappo/archives/000835.html

しかし1点問題が出ました。 上記のサイトでも言及してある通り、次のページ、前のページのような施策には前ページレコードのLastIDを用いれば高パフォーマンスを維持しながらのページングが可能なのですが、Googleの検索結果のように、 「前へ 1 2 3 4 5 6 次へ」みたいなリッチなページングの実装を高パフォーマンスで行うアイディアが浮かばないのです。

現在の状況と実現したい施策は下記の通りです。

■Spotsテーブルの内容例

spot_id | name | spot_category_id
      1 | hoge |                1
      2 | hugo |                2
      3 | huga |                1
・・・・
 100000 | hego |                1

まず、上記のテーブルがあったとして、 spot_category_idの値を10件取得します。

select * from spots where spot_category_id = 1 order by spot_id asc limit 10;

この時、例えば下記の値が10件、返却されたとします。

spot_id | name | spot_category_id
      1 | hoge |                1
      3 | huga |                1
・・・・
    100 | huge |                1
 100000 | hego |                1

次のページの10件を高パフォーマンスで取得しようと考えれば、アプリケーションからLastIDを受け取り、それを利用して下記のSQLを発行すればいいと思います。

select * from spots where spot_category_id = 1 and spot_id > 100000 order by spot_id asc limit 10;

Googleの検索結果のように、「前へ 1 2 3 4 5 6 次へ」のような機能を実現するのであれば、問題は、spot_idが連番になっていない(まばら)ため、各ページのURLのパラメタにLastIDを持たすことは難しいのでDBをフルスキャンするLimit Offsetを利用するしかないのでは?と考えてしまっています。

こちら、どうにか Googleの検索結果のように、「前へ 1 2 3 4 5 6 次へ」のような施策を高パフォーマンスを維持したまま実現するアイディアはありませんか?