複数の条件の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 |
(単位は秒)
一番シンプルな①が普通に速かった。誤差レベルではある気がするけど。