Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

MySQL có loại bỏ common subexpression giữa SELECT và HAVING/GROUP BY không? Test bằng SLEEP()

Câu hỏi

MySQL có tối ưu (loại bỏ) biểu thức chung giữa SELECT và GROUP BY/HAVING không?

Cách test: Dùng SLEEP()

Nếu biểu thức được tính lại cho GROUP BY → tổng thời gian = số nhóm × sleep_time.

Test Case 1: Lặp biểu thức trong GROUP BY

mysql> SELECT value + SLEEP(3) 
    -> FROM sleepDemo 
    -> GROUP BY value + SLEEP(3);

Kết quả: 9 giây (3 nhóm × 3 giây)

+----------------+
| value+sleep(3) |
+----------------+
| 40             |
| 60             |
+----------------+
2 rows in set (9.00 sec)

Test Case 2: Dùng ALIAS trong GROUP BY

mysql> SELECT value + SLEEP(3) AS v 
    -> FROM sleepDemo 
    -> GROUP BY v;

Kết quả: 9 giây (vẫn tính lại)

+------+
| v    |
+------+
| 40   |
| 60   |
+------+
2 rows in set (9.00 sec)

Kết luận

  • MySQL KHÔNG loại bỏ common subexpression giữa SELECT và GROUP BY
  • Biểu thức được tính **2 lần**: 1 cho SELECT, 1 cho GROUP BY
  • Dùng ALIAS trong GROUP BY cũng không giúp (MySQL vẫn evaluate lại)

Giải pháp tối ưu

Cách 1: Subquery/Derived table

WITH cte AS (
    SELECT value + SLEEP(3) AS v FROM sleepDemo
)
SELECT v FROM cte GROUP BY v;

Cách 3: Lưu vào biến/bảng tạm