在此查询上难以搜索,它会搜索包含大约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;
答案 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上添加键。 两个字段的覆盖键可能更好