count(*)とcount(列名)の違いを知った
SQLのcountは(*)と(列名)の2つの指定方法があるが、結果が全く同じというわけではない。
なんとなくは知っていたけど、なんとなくなので忘れないように投稿して残しておこうと思う。
count(*)とcount(列名)の違いは大きく2点。ひとつはパフォーマンスで、もうひとつはNULLが対象となるかどうか。
INDEXの無い列を指定すると遅い
まあそりゃそうだよね、という話。
count(*)
ならインデックスが使われるので性能面を気にする必要は(ほとんどの場合)ない。一方で列名指定してcountする時は、インデックスが張られていない列を指定すると当然性能に影響する。
列名指定はNULLがカウントされない
こっちはうっかり忘れそうになるポイント。count(列名)
はNULLをカウントしない。
id | name |
---|---|
1 | 佐藤 |
2 | 鈴木 |
3 | NULL |
4 | 田中 |
5 | NULL |
なのでこういうテーブルにそれぞれのクエリ投げると件数が違う。
SELECT count(*) FROM names; -- 5
SELECT count(name) FROM names; -- 3
アスタリスク指定が行を数えるのに対して、列名指定は列にある値を数える。と覚えれば良さそう。なぜならNULL
は値ではないから。
参考文献
漢の人の記事を読んでみるとInnoDBについてもっと理解したほうが良さそうだなと思った。が、今日は眠いのでこの辺にしておく。