[Codeigniter-users] SELECT count(*)について

Back to archive index

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などの場合は
たぶんもっと差が出るのではないでしょうか?




Codeigniter-users メーリングリストの案内
Back to archive index