tôi có một cái nhìn (viewX
) dựa trên tham gia của một số bảng:Sự khác biệt giữa HAVING và WHERE trong Truy vấn MySQL là gì?
Khi tôi sử dụng WHERE
, truy vấn bị chậm trễ, sử dụng bộ vi xử lý đi đến 50% và cuối cùng tôi cần phải đóng mysqld.exe
dịch vụ và khởi động lại để cố gắng giải quyết vấn đề một lần nữa.
Khi tôi sử dụng HAVING
, truy vấn thực hiện hoàn hảo và nhanh chóng, tôi nhận được kết quả và tất cả đã sẵn sàng.
Truy vấn là tương tự như sau:
SELECT * FROM viewX WHERE column_of_view = 'foo'
SELECT * FROM viewX HAVING column_of_view = 'foo'
gì đang xảy ra?
Giải pháp tôi thấy là để làm một cái gì đó như thế này:
SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'
SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'
cả hai truy vấn hoạt động tốt, NHƯNG, tôi nghĩ rằng đây là BAD! (SELECT * FROM (... viewX) ????)
bạn có thể đăng một số kế hoạch thực hiện không? – Thilo
Dự đoán tốt nhất của tôi là bằng cách sử dụng HAVING, bạn đang bối rối với trình tối ưu hóa truy vấn giống như bạn đang bối rối và sự nhầm lẫn này dẫn đến một kế hoạch thực hiện khác (thứ tự và phương thức tham gia khác nhau), trong trường hợp này thực sự có lợi nhiều người tham gia, tiềm năng cho một thứ tự tham gia tối ưu là rất lớn). Liệu nó chỉ trả về một vài hàng đầu tiên nhanh hơn, hay toàn bộ lựa chọn cho tất cả các hàng cũng nhanh hơn? – Thilo
Điều gì sẽ xảy ra nếu bạn chỉ định cả hai? – Thilo