Có thể là bài báo bạn đọc đã sử dụng một ví dụ xấu hoặc bạn đã hiểu sai ý của họ.
select username from users where company = 'bbc' or company = 'itv';
Điều này tương đương với:
select username from users where company IN ('bbc', 'itv');
MySQL có thể sử dụng một chỉ mục trên company
cho truy vấn này tốt. Không cần thực hiện bất kỳ UNION nào.
Trường hợp phức tạp hơn là bạn có OR
điều kiện liên quan đến hai khác nhau cột.
select username from users where company = 'bbc' or city = 'London';
Giả sử có một chỉ mục trên company
và một chỉ mục riêng trên city
. Cho rằng MySQL thường chỉ sử dụng một chỉ mục cho mỗi bảng trong một truy vấn nhất định, nó nên sử dụng chỉ mục nào? Nếu nó sử dụng chỉ mục trên company
, nó vẫn sẽ phải quét bảng để tìm các hàng có city
là Luân Đôn. Nếu nó sử dụng chỉ mục trên city
, nó sẽ phải quét bảng cho các hàng có company
là bbc.
UNION
giải pháp dành cho loại trường hợp này.
select username from users where company = 'bbc'
union
select username from users where city = 'London';
Giờ đây, mỗi truy vấn con có thể sử dụng chỉ mục để tìm kiếm và kết quả của truy vấn con được kết hợp bởi UNION
.
Một người dùng ẩn danh đã đề xuất chỉnh sửa cho câu trả lời của tôi ở trên, nhưng người kiểm duyệt đã từ chối chỉnh sửa. Nó đáng lẽ phải là một bình luận, không phải là một chỉnh sửa. Yêu cầu của chỉnh sửa được đề xuất là UNION phải sắp xếp tập hợp kết quả để loại bỏ các hàng trùng lặp. Điều này làm cho truy vấn chạy chậm hơn và do đó, việc tối ưu hóa chỉ mục là một bước rửa sạch.
Câu trả lời của tôi là các chỉ mục giúp giảm kết quả được đặt thành một số lượng nhỏ hàng trước khi UNION xảy ra. Trên thực tế, UNION loại bỏ các bản sao, nhưng để làm điều đó, nó chỉ phải sắp xếp tập hợp kết quả nhỏ. Có thể có trường hợp các mệnh đề WHERE khớp với một phần đáng kể của bảng và việc sắp xếp trong UNION cũng tốn kém như chỉ cần thực hiện quét bảng. Nhưng việc tập hợp kết quả bị giảm bớt bởi các tìm kiếm được lập chỉ mục thường xảy ra hơn, vì vậy việc sắp xếp ít tốn kém hơn nhiều so với việc quét bảng.
Sự khác biệt phụ thuộc vào dữ liệu trong bảng và các thuật ngữ đang được tìm kiếm. Cách duy nhất để xác định giải pháp tốt nhất cho một truy vấn nhất định là thử cả hai phương pháp trong trình biên dịch truy vấn MySQL và so sánh hiệu suất của chúng.