質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

1回答

651閲覧

MySQLで単一テーブルから複数カラムを重複排除後にSUM関数で集計したい

s_yoshi

総合スコア30

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2023/09/25 05:15

MySQLで単一テーブルから複数カラムを重複排除後にSUM関数で集計したい

MySQL 5.7を使用しております。
実現したいことは単一のテーブルで複数カラム(C1,C2,C3,C4,C5)の重複を排除したのち
重複排除した別のカラムをSUM関数で集計を行ないたいと思っております。
レコード件数は約3千万件以上あります。イメージとしては以下のSQLを考えましたが
単純にGROUP BYしてSUM関数で集計すればよいと考えられますが、パフォーマンスが極端に落ちます。
パフォーマンスを上げるSQLが考えられず悩んでおります。
どなたかお力をお貸し願いますでしょうか。

[パフォーマンスの悪いクエリ1] SELECT C1 , C2 , C3 , C4 , C5 , SUM(C6) FROM sample_table t1 GROUP BY C1 , C2 , C3 , C4 , C5 [パフォーマンスの悪いクエリ2] SELECT C1 , C2 , C3 , C4 , C5 , SUM(C6) FROM sample_table t1 LEFT JOIN ( SELECT DISTINCT C1 , C2 , C3 , C4 , C5 FROM sample_table t2 ) a ON a.C1 = t1.C1 AND a.C2 = t1.C2 AND a.C3 = t1.C3 AND a.C4 = t1.C4 AND a.C5 = t1.C5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

C1~C6をひとまとめにした複合インデックスを貼ってください

参考

SQL

1create table tbl(id int primary key, 2c1 varchar(10) not null, 3c2 varchar(10) not null, 4c3 varchar(10) not null, 5c4 varchar(10) not null, 6c5 varchar(10) not null, 7c6 int not null, 8index (c1,c2,c3,c4,c5,c6)); 9 10 11insert into tbl values 12( 1,'a1','b1','c1','d1','e1',1), 13( 2,'a1','b1','c1','d1','e1',2), 14( 3,'a1','b1','c2','d2','e2',3), 15( 4,'a1','b2','c2','d2','e2',4), 16( 5,'a1','b2','c2','d2','e2',5), 17( 6,'a2','b2','c2','d2','e2',6), 18( 7,'a2','b3','c2','d2','e2',7), 19( 8,'a2','b3','c2','d2','e2',8), 20( 9,'a3','b4','c2','d2','e2',9), 21(10,'a3','b4','c2','d2','e2',0);

集計

SQL

1select 2c1,c2,c3,c4,c5 3,count(*) as cnt 4,sum(c6) as sum_c6 5from tbl 6group by c1,c2,c3,c4,c5

重複データを除外

SQL

1select 2c1,c2,c3,c4,c5 3,sum(c6) as sum_c6 4from tbl 5group by c1,c2,c3,c4,c5 6having count(*)=1

インデックスチェック

SQL

1explain select 2c1,c2,c3,c4,c5 3,sum(c6) as sum_c6 4from tbl 5group by c1,c2,c3,c4,c5 6having count(*)=1

別解釈

こういうことかも

SQL

1select sum(c6) as sum_c6 from tbl as t1 2where not exists( 3select 1 from tbl where 1 4and id<>t1.id 5and c1=t1.c1 6and c2=t1.c2 7and c3=t1.c3 8and c4=t1.c4 9and c5=t1.c5 10)

投稿2023/09/25 05:20

編集2023/09/25 09:09
yambejp

総合スコア117667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_yoshi

2023/09/25 07:12

早速のご回答ありがとうございます。 情報が不足しておりまして申し訳ございません。 複合インデックスについては貼っております。貼った状態で134秒かかっております。 この処理時間はローカルのSSDに対してのIOになります。 但し、実際はHDDでSQLが流れますのでSSDに対して数倍から数十倍の処理時間がかかるとの記事を ネットで検索したことがあります。134秒という数値が妥当なのかはわかりませんが、もし高速化が できればと思っております。なお、HDDでの確認手段がないことを付け加えさせていただきます。
yambejp

2023/09/25 09:10 編集

explainでインデックスの使用状況を確認ください ※参考データを確認のこと c1-c5がユニークでc6をsumするということは実は別解のようなことを希望かも
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問