ここ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回でよかったんだ。
もっと、マニュアル読もう。