数百万行のテーブルがあり、テーブルにクエリを実行していますが、インデックスなどを追加してクエリを最適化できるかどうかを知りたいです。
テーブルスキーマ:
CREATE TABLE `aggregate_data` (
`impressions` int(10) unsigned NOT NULL,
`clicks` int(10) unsigned NOT NULL,
`leads` int(10) unsigned NOT NULL,
`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`country` varchar(2) COLLATE utf8_bin NOT NULL,
`campaign_id` int(10) unsigned NOT NULL,
`payout` decimal(12,6) NOT NULL,
`revenue` decimal(12,6) NOT NULL,
`creative_id` int(10) unsigned NOT NULL DEFAULT '0',
`advertiser_id` int(11) unsigned NOT NULL DEFAULT '0',
`offer_id` int(11) unsigned NOT NULL DEFAULT '0',
`affiliate_id` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`country`,`campaign_id`,`date`),
KEY `date_added` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
SQLクエリ:
SELECT
DATE_FORMAT(`date`, "%Y-%m-01 00:00:00") AS `date`,
offer_id,
country,
@sum_impressions := SUM(impressions),
@sum_clicks := SUM(clicks),
@sum_leads := SUM(leads),
@sum_payout := SUM(payout),
@sum_revenue := SUM(revenue)
FROM aggregate_data
WHERE `date` >= '2012-12-00 00:00:00'
GROUP BY country, offer_id, MONTH(`date`), YEAR(`date`)
説明を行うと、テーブル内のすべての行を使用していることが常に通知されます。
+----+-------------+----------------+------+---------------+------+---------+------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+------+---------------+------+---------+------+--------+----------------------------------------------+
| 1 | SIMPLE | aggregate_data | ALL | date_added | NULL | NULL | NULL | 809715 | Using where; Using temporary; Using filesort |
+----+-------------+----------------+------+---------------+------+---------+------+--------+----------------------------------------------+
WHERE句のために「Usingwhere」を使用し、group byのために「Usingtemporary」を使用し、group byのためにfilesortを使用します(私は思います)。
ここで、他にどのようなインデックスなどを追加する必要があるので、このクエリを最適化します。行が大きくなると、実行に数秒かかります。
このSELECTステートメントは「INSERTINTO...ON DUPLICATE KEY UPDATE」ステートメントの一部であるため、「@sum_impressions」などの変数が使用されます。