我经常看到人们用这样的查询来回答 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 优化持悲观态度,因此我喜欢尽我所能提供帮助。
最佳答案
我认为这可以使用 sleep() 函数进行测试,
例如,看一下这个演示:http://sqlfiddle.com/#!2/0bc1b/1
Select * FROM t;
| X |
|---|
| 1 |
| 2 |
| 2 |
SELECT x+sleep(1)
FROM t
GROUP BY x+sleep(1);
SELECT x+sleep(1) As name
FROM t
GROUP BY name;
两个查询的执行时间约为 3000 毫秒(3 秒)。
表中有 3 条记录,对于每条记录,查询仅休眠 1 秒,
因此这意味着每个记录的表达式仅计算一次,而不是两次。
关于mysql - MySQL 是否消除了 SELECT 和 HAVING/GROUP BY 子句之间的公共(public)子表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53124790/