有没有机会加速这个简单的MySQL查询?

时间:2012-11-14 22:47:00

标签: mysql performance query-optimization

在此查询上难以搜索,它会搜索包含大约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;

3 个答案:

答案 0 :(得分:1)

date_day上没有有效索引。

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

答案 1 :(得分:0)

任何时候你做'分组'你都要求全表扫描。

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

如果你不能更好地索引它(参见@njk答案),那么你可能想要选择你的特定值,然后在子集上进行分组,求和等。如果没有别的,至少它将是一个较小的排序集。

答案 2 :(得分:0)

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