2073 レコードカウント はくぶん 2009-10-10 19:49:41
SQL構文のcount関数はcount(*)が一般的なようだが、
例えばidカラムにプライマリーキーが張られている場合、
count(id)とした方が、where句やorder by句の有無に関わらず、
処理が安定して速いような気がする。

この掲示板にはcount関数が多用されていて、
以前はcount(*)としていたが、数日前にすべてcount(id)に変えた。
もちろんidカラムにはプライマリーキーが張られている。

count(*)の頃は表示所要時間は3秒は無理で、
4秒〜数十秒という風に相当なバラつきがあったのに、
変更後は毎回3秒か4秒で安定している。

この掲示板ではスロークエリは5秒に設定されており、
count(*)の頃は2週間で何百というスロークエリが発生していた。
つまり処理に5秒以上かかる遅いクエリが、それだけあったということだが、
しかし、変更後は僅かにひと桁と極端に減っている。

以前も書いたが、MyISAMは処理の際、テーブル全体にロックがかかるため、
処理が重なった場合、タイミングによっては読み取り待ち(待機状態)が発生する。
そのために表示所要時間にバラつきが出るのだが、
プライマリーキーをカウントすると、その影響を受けないのだろうか。
また、プライマリーキーではなく、インデックスの場合はどうなのだろうか。
メッセージ文字数:557/579