使用DATE_FORMAT函数优化MySQL查询

时间:2012-02-27 20:06:03

标签: mysql query-optimization

快速服务器上最多需要4.5秒才能完成此查询并将结果输出到400K行的表

输出 月周视图 02 27 581

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

1 个答案:

答案 0 :(得分:0)

HAVING子句用于在ORDER BY和ORDER BY后限制结果 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