Có tốt hơn không khi đặt các bộ lọc vào mệnh đề THAM GIA thay vì mệnh đề WHERE


7

MySQL 5.5.8:

Câu hỏi 1:
Có sự khác biệt nào trong các tuyên bố sau và nếu vậy, đó là ưu tiên thực hiện khôn ngoan? Điều này thậm chí có thể được trả lời mà không cần biết số lượng hàng của các bảng trước và sau mệnh đề where và việc sử dụng chỉ mục có thể?

SELECT *
FROM a JOIN b ON a.id = b.id AND a.col2 BETWEEN 1 AND 5;

SELECT *
FROM a JOIN b ON a.id = b.id
WHERE a.col2 BETWEEN 1 AND 5;

Lý do tôi hỏi là vì nếu ví dụ các bảng rất lớn nhưng mệnh đề nơi lọc 99.9999% hồ sơ, tôi không muốn lãng phí thời gian tham gia các bảng lớn nếu sau khi tham gia 99.9999% hồ sơ không được sử dụng.

Câu hỏi 2:

Thực hiện cùng một tình huống, câu lệnh nào (nếu có sự khác biệt) yêu cầu ít IOPS hơn. (chỉ số hiện diện trên b.id và một trên a.col2)


Đã xóa câu trả lời của tôi về Câu hỏi 1 vì bạn đã có nhiều câu trả lời hơn ... chúng tôi có thể sử dụng kết quả đầu ra của bảng tạo chương trình để cung cấp cho bạn câu trả lời tốt hơn cho Câu hỏi 2
Raymond Nijland

Câu trả lời:


10

Với bất kỳ công cụ lập kế hoạch truy vấn tốt nào (và mysc của IIRC là đủ tốt về vấn đề này) cho các truy vấn trong đó tất cả các tham gia là tham gia bên trong (như của bạn ở đây, trừ khi bạn quy định mặc định tham gia vào các tham gia bên trong), không quan trọng bạn có đặt bộ lọc hay không tham gia so sánh trong một mệnh đề ON hoặc trong WHERE.

Với sự hiện diện của các kết nối bên ngoài phức tạp hơn, điều này rõ ràng hơn rất nhiều vì vị trí của mệnh đề lọc có thể (nhưng không phải luôn luôn) có ảnh hưởng đáng kể tùy thuộc vào dữ liệu đầu vào.

Để thuyết phục bản thân, hãy tạo một tập dữ liệu lớn và thử cả hai để xem có sự khác biệt nào không. Là một bài tập học tập để có được cảm giác tốt về những gì tối ưu hóa trong công cụ DB đã chọn của bạn có thể và không thể làm được, rất ít nhịp đập một số suy nghĩ tốt về thử nghiệm, giám sát và đo điểm chuẩn.


1
Bạn đã đúng, điều đầu tiên trình tối ưu hóa thực hiện với INNER THAM GIA là hợp nhất các điều kiện ON và WHERE.
jynus

@jynus làm thế nào để thấy rằng INNER
James

Bạn có thể đọc logic tham gia tại github.com/mysql/mysql-server/blob/8.0/sql/
mẹo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.