count(*)を使わない行数の数え方

例のTipsの72番にCOUNT(*)を使わないことというのが有った。代替案として挙げられていた方法が初耳だったので、調べてみた。
なんでもSELECTのオプションにSQL_CALC_FOUND_ROWSというのが新設されて(4.0以降)、それを使うと良いらしい。

mysql> select SQL_CALC_FOUND_ROWS *  from attach limit 20;

とそのオプション付きでSELECTを一回実行し、その後found_rows()という関数で実行すると

mysql> select found_rows() ;
                              • +
found_rows()
                              • +
300
                              • +
1 row in set (0.00 sec)

その検索対象の総数が取れるという仕組み。一回目のSELECTでlimit句を付けて出力結果の総数を制限していても、その後検索条件にヒットしたのが何件だったのが取得出来るというのがキモ。
ウェブなんかでよくあるページングなんかの処理に使うと良いかも。