mysql - MySQL 是否消除了 SELECT 和 HAVING/GROUP BY 子句之间的公共(public)子表达式

标签 mysql group-by query-optimization having

我经常看到人们用这样的查询来回答 MySQL 问题:

SELECT DAY(date), other columns
FROM table
GROUP BY DAY(date);

SELECT somecolumn, COUNT(*)
FROM table
HAVING COUNT(*) > 1;

我总是喜欢给列一个别名,并在GROUP BYHAVING子句中引用它,例如

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/

相关文章:

mysql - 如何循环mysql程序?

mysql - 实时MySQL二进制日志解析

php - 选择带日期的数据库数据

mysql - 仅使用 1 个 group by 子句重写查询

即使使用 INNER JOIN 而不是 IN,MySQL 查询也非常慢

php - mysql 小数和 double 据问题

mysql - 显示分组依据的所有行

mysql - 显示分组依据的最大列 - 显示所有行

postgresql - PostgreSQL 中的 HAVING 子句是如何优化的?

sql - 如何在大 table 上快速计数?