1

遇到这个查询时,它会搜索一个包含大约 213k 行的重要表。查询的目的是上报一个月的流量数据。该月每一天的流量。以及每天的十进制值的总和。这个查询经常运行,所以我需要尽可能优化它。目前需要平均。2秒..

SQL小提琴:http ://sqlfiddle.com/#!2/171f5/3/0

所有建议将不胜感激!谢谢你。

询问:

SELECT `date_day`, COUNT(*) AS num, SUM(decval) AS sum_decval FROM (`tbl_traffic`)
WHERE `uuid` = '1' AND `date_year` = '2012' AND `date_month` = '11'
GROUP BY `date_day`;

解释结果:

id: 1
select_type: SIMPLE
table: adb1_analytics
type: ref
possible_keys: keys1,keys2,keys3
key: keys1
key_len: 7
ref: const,const,const
rows: 106693
Extra: Using where
1 row in set (0.13 sec)

表结构:

CREATE TABLE IF NOT EXISTS `tbl_traffic` (
  `id` int(100) unsigned NOT NULL AUTO_INCREMENT,
  `uuid` int(100) unsigned NOT NULL,
  `country` char(2) CHARACTER SET latin1 DEFAULT NULL,
  `browser` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  `platform` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  `referrer` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `decval` decimal(15,5) NOT NULL,
  `date_year` smallint(4) unsigned NOT NULL,
  `date_month` tinyint(2) unsigned NOT NULL,
  `date_day` tinyint(2) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `keys1` (`uuid`,`date_year`,`date_month`,`date_day`),
  KEY `keys2` (`date_year`,`date_month`,`referrer`),
  KEY `keys3` (`date_year`,`date_month`,`country`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
4

3 回答 3

1

您没有有效的索引date_day

我建议专门为您要获取和计算的内容创建一个密钥:(date_day, decval)

于 2012-11-14T22:49:35.553 回答
0

每当您执行“分组依据”时,您都要求进行全表扫描。

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

如果您无法更好地对其进行索引(请参阅@njk 答案),那么您可能需要选择您的特定值,然后对子集进行分组、求和等。如果不出意外,至少它将是一个较小的排序集。

于 2012-11-14T22:52:25.220 回答
0

使用 count(id) 并在 date_day 和 decval 上添加键。两个领域的覆盖键可能会更好

于 2012-11-14T23:00:20.770 回答