Nếu chúng tôi xem xét rằng bạn sử dụng INNER JOIN
thay vìLEFT JOIN
(dường như là mục đích của bạn), hai truy vấn này tương đương về mặt chức năng. Trình tối ưu hóa truy vấn sẽ xem xét và đánh giá các tiêu chí trong WHERE
mệnh đề và mệnh đề của bạn FROM
và xem xét tất cả các yếu tố này khi xây dựng kế hoạch truy vấn để đạt được kế hoạch thực hiện hiệu quả nhất. Nếu chúng ta thực hiện EXPLAIN
trên cả hai câu lệnh, chúng ta sẽ nhận được cùng một kết quả:
Truy vấn 1 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
WHERE
tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
AND tableA.ColE=tableB.ColE
[Các kết quả] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
Truy vấn 2 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
AND tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
WHERE
tableA.ColE=tableB.ColE
[Các kết quả] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
Bạn có thể xem lại chi tiết đầy đủ với các liên kết sau. Tôi cũng đã tạo một ví dụ SQL 2008 để bạn có thể so sánh cách hai công cụ hoạt động (giống nhau):
Ví dụ truy vấn MySQL
Ví dụ truy vấn SQL 2008 (Đảm bảo bạn 'Xem Kế hoạch thực hiện' cho cả hai kết quả)
INNER JOIN
, nhưng vớiLEFT JOIN
điều này sẽ trả lại kết quả khác nhau. Về cơ bản, các điều kiện mà bạn đã thêm vàoWHERE
truy vấn thứ hai là chuyển đổiJOIN
trên mộtINNER JOIN