MySQL 是否消除了 SELECT 和 HAVING/GROUP BY 子句之间的公共子表达式?如何测试?
mysqlmysqli database
要进行测试,请使用 sleep() 函数。
案例 1 −
语法如下 −
SELECT yourColumnName+sleep(yourIntegerValue) FROM yourTableName GROUP BY yourColumnName+sleep(yourIntegerValue);;
案例 2 − 您可以使用另一种语法,如下所示 −
SELECT yourColumnName+sleep(yourIntegerValue) As anyAliasName FROM yourTableName GROUP BY yourAliasName;
为了理解上述语法,让我们创建一个表。创建表的查询如下 −
mysql> create table sleepDemo -> ( -> value int -> ); Query OK, 0 rows affected (1.25 sec)
使用 insert 命令在表中插入一些记录。 查询语句如下 −
mysql> insert into sleepDemo values(40); Query OK, 1 row affected (0.18 sec) mysql> insert into sleepDemo values(60); Query OK, 1 row affected (0.19 sec) mysql> insert into sleepDemo values(60); Query OK, 1 row affected (0.10 sec)
使用 select 语句显示表中的所有记录。查询如下 −
mysql> select *from sleepDemo;
这是输出 −
+-------+ | value | +-------+ | 40 | | 60 | | 60 | +-------+ 3 rows in set (0.00 sec)
以下是消除 SELECT 和 HAVING/GROUP BY 子句之间公共子表达式的查询。
案例 1 − 查询如下−
mysql> SELECT value+sleep(3) -> FROM sleepDemo -> GROUP BY value+sleep(3);
输出如下 −
+----------------+ | value+sleep(3) | +----------------+ | 40 | | 60 | +----------------+ 2 rows in set (9.00 sec)
上述查询每个值耗时 9 秒(3 秒耗时 40 秒,3 秒耗时 60 秒,3 秒耗时 60 秒)。
案例 2 − 查询如下 −
mysql> SELECT value+sleep(3) As v -> FROM sleepDemo -> GROUP BY v;
输出如下 −
+------+ | v | +------+ | 40 | | 60 | +------+ 2 rows in set (9.00 sec)