Đây là một thiếu sót đã biết trong MySQL.
Việc sử dụng UNION
thường đúng hoạt động tốt hơn truy vấn phạm vi như truy vấn bạn hiển thị. MySQL không sử dụng các chỉ mục một cách thông minh cho các biểu thức sử dụng IN (...)
. Một lỗ hổng tương tự tồn tại trong trình tối ưu hóa cho các biểu thức boolean với OR
.
Xem http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ để biết một số giải thích và điểm chuẩn chi tiết.
Trình tối ưu hóa luôn được cải thiện. Sự thiếu sót trong một phiên bản MySQL có thể được cải thiện trong phiên bản tiếp theo. Vì vậy, bạn nên thử nghiệm các truy vấn của mình trên các phiên bản khác nhau.
Cũng có lợi khi sử dụng UNION ALL
thay vì chỉ là UNION
. Cả hai truy vấn đều sử dụng bảng tạm thời để lưu trữ kết quả, nhưng sự khác biệt là UNION
áp dụng DISTINCT
vào tập kết quả, sẽ phát sinh thêm một loại chưa được lập chỉ mục.