使用日期\格式函数优化MySQL查询

使用日期\格式函数优化MySQL查询,mysql,query-optimization,Mysql,Query Optimization,在fast服务器上,完成此查询并在一个包含400K行的表上输出结果将需要4.5秒 输出 月周浏览量 0227581 SELECT DATE_FORMAT(`DataDateTime`, '%m') AS `Month`, DATE_FORMAT(`DataDateTime`, '%d') AS `Day`, COUNT(DISTINCT(`DataUserID`)) AS `Views` FROM `la_data` WHERE `DataLayerName` = 'la

在fast服务器上,完成此查询并在一个包含400K行的表上输出结果将需要4.5秒

输出 月周浏览量 0227581

SELECT 
  DATE_FORMAT(`DataDateTime`, '%m') AS `Month`, 
  DATE_FORMAT(`DataDateTime`, '%d') AS `Day`, 
  COUNT(DISTINCT(`DataUserID`)) AS `Views`
FROM `la_data` 
WHERE
  `DataLayerName` = 'layar' 
  AND `DataDateTime` > '' 
GROUP BY `Day`, `Month` 
HAVING `Day` = 27 AND `Month` = 02 
ORDER BY `Views` DESC

HAVING子句用于在和命令执行后限制结果 已处理GROUP BY子句。由于它们是在主查询发生后处理的,因此无法对它们进行优化,这就是查询耗时如此之长的原因。由于日和月函数不受这两个子句的影响,因此它们应该位于WHERE子句中。请尝试将它们放在其中。注意,您必须使用WHERE中的完整表达式:

...
WHERE
  `DataLayerName` = 'layar' 
  AND `DataDateTime` > ''
  AND DATE_FORMAT(`DataDateTime`, '%d') = 27
  AND DATE_FORMAT(`DataDateTime`, '%m') = 02
GROUP BY `Day`, `Month` 
ORDER BY `Views` DESC

如果不使用DISTINCT,速度会更快吗?是的,速度会快1.3秒,但不会给出相同的结果-是的,我只是想找出瓶颈。DataDateTime字段是什么类型的?DataDateTime type=DateTime哇,是的,这就是问题所在!查询时间为0.43秒,而不是4.5秒