High Performance MySQLメモ:count

1559 ワード

SQLでcount()を使うのはとても自然なことのようです。
SELECT COUNT(*) FROM TABLE_NAME;

count(*)と単独のcountの違いは、後者の方が効率がいいのではないかと思ったことがありますが、ずっと追及していません。
Chapter 6:Query Perfomance Optimizationでは専門的にcountを話しました。
count:このcolumn上のNULLでない行数だけ計算されます。この挙動は他の凝集関数と同じです。(SUMはNULLの行を無視します。)
count(*):つまり、統計の行数です。
 
count()には表現が入れられます。
SELECT COUNT(IF(hbase_app_id is NULL, 1, NULL)) FROM im_task;

このときcountで得られたのは、この列のnullの行数です。もう一つの文の例のようです。
SELECT COUNT(color = 'blue' OR NULL) AS blue, COUNT(color = 'red' OR NULL) AS red FROM items;

 注意:
count(NULL)=0で、他のNULLではない表現は全部1になります。
(SELECT 'COUNT(0)' AS count_type, 	COUNT(0) as value)

UNION

(SELECT 'COUNT(1)', 			COUNT(1))

UNION

(SELECT 'COUNT(NULL)', 			COUNT(NULL))

戻りの結果は以下の通りです。
count_type,      value

COUNT(0),       1

COUNT(1),       1

COUNT(NULL),    0
 
また、MyISAMエンジンの実行速度についても説明した。
MyISAMエンジン内部に表の正確な行数が格納されているので、count(*)の場合は他の選別可能な行の条件を持たずに、直接にエンジンから与えられた数値を使用します。