使用日期\格式函数优化MySQL查询
在fast服务器上,完成此查询并在一个包含400K行的表上输出结果将需要4.5秒 输出 月周浏览量 0227581使用日期\格式函数优化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
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秒