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)

相关文章