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