快速服务器上最多需要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
答案 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