クエリーは1回でよかったんだ

ここ6年くらいphpによるwebアプリの作成にかかわってきた。
LAMP(Linux Apache Mysql Php)やWAMP(Windows Apache Mysql Php)ありとオープンソースだらけ。
特に照会系のアプリケーションをたくさん作ってきた。

たくさんの結果がヒットしたときには、Googleのようにページ送りの機能をつけるのを常としている。
そうでないとWEBに表示するにも時間がかかる。

例えば1000件ヒットしたとして、最初に50件表示させる。すると残りは950件なので19ページ分のページ番号を作る。
次ページは、50件から100件までを表示。同じようにページ番号を振る。
この一連のデータベース問い合わせ(クエリー)には、合計件数を取得するために1回。
50件分だけ取り出すために1回。計2回のクエリーを発行していた。

データベースはMySQLである。

あるとき、ふと、マニュアルを読んでいたら、FOUND_ROWS() という関数に目がとまった。
なになに、「状況によっては、LIMIT を指定しなかった場合にいくつのレコードが返されるかを、ステートメントを再度実行することなく確認したいことがある。」と書いてある。

えっ、それって…。

SELECT 文に SQL_CALC_FOUND_ROWSを使用すると、対象のテーブルの件数をSELECTと同時にCOUNT。
そのため、通常は2回のSELECT文が必要な所を1回のクエリで取得できるそうな。

いろいろ調べてみるとパフォーマンスも70%よくなるとのこと。

早速試してみる。

…速い。

そう、私が6年間もずっと書いてきたプログラムは間違いではなかったけど、非効率であることがわかったのである。

知らなかった。クエリは1回でよかったんだ。

もっと、マニュアル読もう。