テーブル設計について。
テーブル設計について。
DBから集計して、このような表を出しているのですが、
現在、レコードが10万件ほどあり、集計のクエリが終わるまで7秒近くかかっています。
※以下、タブ区切りにしてありますので、エディタなどに貼り付けて頂くと見やすいと思います。
【表】
質問グループ 質問タグ 答えOK数 答えNG数
A a 2 1
A b 2 0
B a 1 2
【DB】
テーブル:test
id answer group tag
1 OK A a
2 NG A a
3 OK A a
4 OK A b
5 OK A b
6 OK B a
7 NG B a
8 NG B a
【クエリ】
SELECT group, tag,
SUM(CASE WHEN answer='ok' THEN 1 ELSE 0 END) AS ok,
SUM(CASE WHEN answer='ng' THEN 1 ELSE 0 END) AS ng
FROM test
GROUP BY group, tag;
※「id」をprimaryキー、「group、tag、answer」をまとめてuniqueとしてインデックスを貼ってます
ok数とng数の集計に時間がかかってしまっているのですが、
他に良い方法があれば教えて下さい。
また、そもそものテーブル構成を以下のようにすればいいのでは?
とも思ったのですが、どうなんでしょうか?
この形に変えると、集計は一瞬で終わるはずなのですが、
ok と ngを別カラムにするという考え方がしっくりきません。
テーブル構成の考え方としてどうなのか知りたいです。
下のようにすると、okカラムとngカラムの片方にしか値は入らなくなってしまうので、
それだったら最初の構成のように、answerカラムにokかngのどちらかが入るといった方が好ましいのかなとも思い・・
それと今回はたまたまok と ngの固定2つですが、複数になるような場合もあると思うのです。
テーブル:test
id group tag ok ng
1 A a 1 NULL
2 A a NULL 1
3 A a 1 NULL
4 A b 1 NULL
5 A b 1 NULL
6 B a 1 NULL
7 B a NULL 1
8 B a NULL 1
SELECT group, tag, sum(ok), sum(ng)
FROM test
GROUP BY group, tag;
ご教示下さい。
お礼
ありがとうございます。