ワイズリマインダー

ページリンクを実装する時にコストを低くする方法

基本的にはページリンクを作成した時、
SQL_CALC_FOUND_ROWSとLIMIT OFFSETを使いたくなるだろう
でもこれは、LIMITしていながら全てのレコードを処理しているに過ぎない

どうしてもCOUNT値を取得したい場合は、
カウント用の別テーブルを作成して、そちらで取得するといいだろう
もちろんカウント用のテーブルには本来のテーブルと同じWHEREで処理できる必要がある

LIMIT OFFSETにしても数百、数千のレコードならあまり気にする必要は無いかもしれないが、
将来的に考えて対策をしておいても良いだろう
たとえば
SELECT * FROM table WHERE foo>bar LIMIT 10 OFFSET 10000000;
と言う場合、ご丁寧に1000万件に達するまで条件判断している

SELECT * FROM table WHERE id>=[int] LIMIT 11;
と言うようにすると良い
11件目のデータは表示用ではなく、次のページが存在する為の確認である
これにより、先頭のデータからすべて条件判断せずに
一気に指定されたidから数件のデータを処理するだけで良い

同様に前のページが存在するかの確認は
SELECT * FROM table WHERE id<[int] ORDER BY `id` DESC LIMIT 1 これをUNIONすればひとつのクエリで済む そもそも<前へ 1 2 3 4 5 次へ >のような場合には意味がないかもしれない はたしてこのようなページリンクが必要なのだろうか?

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください