我可以帮助您翻译这段文字,它与IT技术有关。您想知道如何优化查询数百万行的表,是否可以通过添加索引或其他方式来优化查询。
表结构:
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 子句,它使用了 "Using where"。由于 GROUP BY,它使用了 "Using temporary" 并且也因为 GROUP BY 而使用了 filesort(我想是这样)。
现在,我应该添加哪些其他索引或其他内容来优化此查询。随着行数增加,运行时间需要几秒钟。
像 "@sum_impressions" 这样的变量被使用是因为此 SELECT 语句是 "INSERT INTO ... ON DUPLICATE KEY UPDATE" 语句的一部分。