アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

複数の条件のCOUNT値を取るときのSQL速度検証

MySQLを前提として書いています

まあ前にも似たようなことをやってるんですが


以下のテーブル「table」があるとします。

id a b
1 1 3
2 2 4
3 1 5
4 2 NULL
5 2 NULL

ここから、
「aが1であるレコードの数」
「aが2であるレコードの数」
「bが3であるレコードの数」
を取るために、次の3つのSQLを考えてみました。

①比較的素直に取得するやつ

SELECT  COUNT(`a` = ? OR NULL) AS `count_1` 
       ,COUNT(`a` = ? OR NULL) AS `count_2` 
       ,COUNT(`b` = ? OR NULL) AS `count_3` 
FROM    `table` 

②WHERE句であらかじめ関係ないやつを削っておくといいんじゃね? と思ったやつ

SELECT  COUNT(`a` = ? OR NULL) AS `count_1` 
       ,COUNT(`a` = ? OR NULL) AS `count_2` 
       ,COUNT(`b` = ? OR NULL) AS `count_3` 
FROM    `table` 
WHERE   `a` = ?  
OR      `a` = ?  
OR      `b` = ?

③もしかしてSUM+CASEの方が速かったりする?と思ったやつ

SELECT  SUM(CASE WHEN `a` = ? THEN 1 ELSE 0 END) AS `count_1` 
       ,SUM(CASE WHEN `a` = ? THEN 1 ELSE 0 END) AS `count_2` 
       ,SUM(CASE WHEN `b` = ? THEN 1 ELSE 0 END) AS `count_3` 
FROM    `table` 

サクッと速度検証。
1000回繰り返し×5回試行です。

1回目 2回目 3回目 4回目 5回目
0.52 0.43 0.42 0.42 0.53
0.60 0.49 0.49 0.49 0.61
0.54 0.44 0.51 0.44 0.54

(単位は秒)

一番シンプルな①が普通に速かった。誤差レベルではある気がするけど。