kunitsuji
tsuji****@m-s*****
2008年 6月 19日 (木) 17:38:55 JST
kunitsujiです。
櫻井さん。
>> よくあるのが、LIMITをつけて取得件数を分けてページネーションするのですが、
>> そのときに全体の件数をとる特にCOUNTを使いますが(MyISAMとか)
>>
>> num_rowの場合はSQLに対しての件数ですから、LIMITで20件だと20ですね。
>
>今回、まさにこの状況でした。
>ページネーションでは全体の件数がいくつか指定する必要があるので、モデルク
>ラスに
> ・表示させたいデータをLIMIT, OFFSET付きで取ってくる関数
> ・それとは別に、表示させたいデータの全ての「件数のみ」を取得する関数
>を書いて、コントロールクラスから呼び出すようにしました。
この部分ですが、上記だと2回SQLが動くことになりますよね。
次のようにされてみてはどうでしょう?
MySQLということで。
$sql = "SELECT SQL_CALC_FOUND_ROWS "
. "* "
. "FROM "
. "TABLE_NAME "
. "WHERE "
. "A = B "
. "LIMIT 0, 20 "
$result = $this->db->query($sql);
$count = $this->db->query("SELECT FOUND_ROWS() as count");
として、
$count = $total->row();
var_dump($count->count);
とすればトータル件数が取り出せますね。
3000件程度でベンチとりました。
こちらのほうが、0.0001〜0.0003早いようです(笑)
件数が多くなればこちらのほうがいいのでしょうかね。
少なくともMyISAMならcount(*)は特殊な取り出ししますが、InnoDBなどの場合は
たぶんもっと差が出るのではないでしょうか?