Bar*_*mar 7 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;
Run Code Online (Sandbox Code Playgroud)
我总是喜欢给列添加一个别名,并在GROUP BYor HAVING子句中引用它,例如
SELECT DAY(date) AS day, other columns
FROM table
GROUP BY day;
SELECT somecolumn, COUNT(*) AS c
FROM table
HAVING c > 1;
Run Code Online (Sandbox Code Playgroud)
MySQL是否足够聪明,可以注意到后面的子句中的表达式与in中的表达式相同SELECT,并且只执行一次?我不确定如何测试这个 - EXPLAIN没有显示任何差异,但它似乎并没有显示它是如何进行分组或过滤的; 它似乎主要用于优化连接和WHERE子句.
我倾向于对MySQL优化感到悲观,所以我想尽我所能给予它.
我认为这可以使用sleep()函数进行测试,
例如看一下这个演示:http://sqlfiddle.com/#!02/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;
Run Code Online (Sandbox Code Playgroud)
两个查询的执行时间约为3000毫秒(3秒).
表中有3条记录,对于每条记录,查询仅休眠1秒,
因此这意味着表达式仅针对每条记录评估一次,而不是两次.