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 | |||