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

Back to archive index

kunitsuji tsuji****@m-s*****
2008年 6月 19日 (木) 17:44:45 JST


 kunitsujiです。

追記です。
ちなみにMyISAMからInnoDBにかえてみました。3000件。
count(*)でやると、約8倍遅くなります。。
0.0024秒。
SELECT FOUND_ROWS()で取得すると
0.0003秒。
ちなみにプライマリーキーでcount(プライマリー)としてみましたが、
3000件程度では変化なし。

アプリケーションでcount(*)をたくさん使っているものが多々ありますが、
MyISAMからInnoDBに変えた瞬間パフォーマンス下がるということがこれでよくわ
かりますね。

>
>櫻井さん。
>
>>> よくあるのが、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 mailing list
>Codei****@lists*****
>http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users




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