【发布时间】:2014-07-12 12:49:43
【问题描述】:
我经常看到人们用这样的查询回答 MySQL 问题:
SELECT DAY(date), other columns
FROM table
GROUP BY DAY(date);
SELECT somecolumn, COUNT(*)
FROM table
HAVING COUNT(*) > 1;
我总是喜欢给列一个别名,并在 GROUP BY 或 HAVING 子句中引用它,例如
SELECT DAY(date) AS day, other columns
FROM table
GROUP BY day;
SELECT somecolumn, COUNT(*) AS c
FROM table
HAVING c > 1;
MySQL 是否足够聪明地注意到后面的子句中的表达式与SELECT 中的表达式相同,并且只执行一次?我不确定如何对此进行测试——EXPLAIN 没有显示出任何区别,但它似乎并没有显示出它首先是如何进行分组或过滤的;它似乎主要用于优化连接和WHERE 子句。
我倾向于对 MySQL 优化持悲观态度,所以我愿意尽我所能提供帮助。
【问题讨论】:
-
以防万一您需要立即回答,作为权宜之计,直到我找到权威参考(我怀疑它可能必须来自源头),我很确定解析器识别对确定性函数(实际上是表达式)的调用并缓存结果以在查询中重复使用。
-
+1 一个连贯且有用的问题!
-
巴尔玛在问问题?我担心我的指南针已经不可逆转地失准了。
-
函数结果被缓存的一个简单演示是
SELECT RAND() FROM table ORDER BY RAND()- 因为结果列确实是排序的,MySQL 必须对RAND()的两次调用使用相同的值。 -
我正在尝试根据优化器源代码整理出一个更权威的答案 - 只是认为现在值得一提。
标签: mysql group-by query-optimization having