大規模データを利用したMySQLページングの目次生成処理について
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 次へ」のような施策を高パフォーマンスを維持したまま実現するアイディアはありませんか?