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

Back to archive index

kunitsuji tsuji****@m-s*****
2008年 6月 24日 (火) 11:32:45 JST


 kunitsujiです。
ということでしらべてみました。

3000件強のデータです。(少ないですが)

まず、count(*)で行った場合、
0.0021 ms
次に
count(c_member_id)で行った場合>プライマリーではなく、インデックスを張っ
ています。
0.0017 ms
プライマリーを直接指定した場合
0.0021 ms
ということは、プライマリーよりも別にIndexを張ったもののほうが早いという
ことでしょうか。

尚、ここでFOUND_ROWS() as countでカウントを取るようにすると、
0.0004 ms
という結果になりました。



>木村と申します。
>
>
>>  kunitsujiです。
>>
>> 追記です。
>> ちなみにMyISAMからInnoDBにかえてみました。3000件。
>> count(*)でやると、約8倍遅くなります。。
>> 0.0024秒。
>> SELECT FOUND_ROWS()で取得すると
>> 0.0003秒。
>> ちなみにプライマリーキーでcount(プライマリー)としてみましたが、
>> 3000件程度では変化なし。
>>
>> アプリケーションでcount(*)をたくさん使っているものが多々ありますが、
>> MyISAMからInnoDBに変えた瞬間パフォーマンス下がるということがこれでよくわ
>> かりますね。
>>
>
>InnoDBは、クラスタインデックスだからでしょうか。
>COUNT(*) だとプライマリキーが利用されると思うので、別インデックスを
>指定した場合はどうなのでしょうか・・・。
>
>
>>>櫻井さん。
>>>>> よくあるのが、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 mailing list
>> Codei****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
>>
>
>
>---
>木村
>
>_______________________________________________
>Codeigniter-users mailing list
>Codei****@lists*****
>http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users




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