環境
DB: Amazon Aurora(MySQL 5.6互換)
対象テーブルには1億レコード以上あります。
やりたいこと
以下のクエリで月毎の「レコード増加数」と「レコード数の累計」を算出しています。
実行結果は変えず、現状4分半→理想1分以内で結果が返ってくるように改善したいです。
SQLが初めてなので、どこがボトルネックになっているのかも解説していただけると助かります。
よろしくお願いいたします。
MySQL
1SELECT 2 t1.accum_date, 3 t1.count, 4 SUM(t2.count) AS accum 5FROM ( 6 SELECT 7 DATE_FORMAT(created, '%Y%m') AS accum_date, 8 COUNT(*) AS count 9 FROM 10 table 11 GROUP BY accum_date 12 ORDER BY accum_date 13) AS t1 14JOIN ( 15 SELECT 16 DATE_FORMAT(created, '%Y%m') AS accum_date, 17 COUNT(*) AS count 18 FROM 19 table 20 GROUP BY accum_date 21 ORDER BY accum_date 22) AS t2 23ON 24 t1.accum_date >= t2.accum_date 25GROUP BY 1 26ORDER BY 1 27;
Result
1+------------+----------+-----------+ 2| accum_date | count | accum | 3+------------+----------+-----------+ 4...(中略)... 5| 201808 | 10000000 | 85000000 | 6| 201809 | 15000000 | 100000000 | 7| 201810 | 20000000 | 120000000 | 8+------------+----------+-----------+ 950 rows in set (4 min 37.47 sec)
追記
EXPLAINの結果です。
+----+-------------+------------+------+---------------+------+---------+------+-----------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+------+---------------+------+---------+------+-----------+----------------------------------------------------+ | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 120000000 | Using temporary; Using filesort | | 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 120000000 | Using where; Using join buffer (Block Nested Loop) | | 3 | DERIVED | table | ALL | NULL | NULL | NULL | NULL | 120000000 | Using temporary; Using filesort | | 2 | DERIVED | table | ALL | NULL | NULL | NULL | NULL | 120000000 | Using temporary; Using filesort | +----+-------------+------------+------+---------------+------+---------+------+-----------+----------------------------------------------------+