Jika kami menganggap bahwa Anda menggunakan INNER JOIN
alih-alih LEFT JOIN
(yang tampaknya adalah maksud Anda), kedua kueri ini secara fungsional setara. Pengoptimal permintaan akan meninjau dan mengevaluasi kriteria dalam WHERE
klausa Anda dan klausa Anda FROM
dan mempertimbangkan semua faktor ini ketika membangun rencana kueri untuk mencapai rencana eksekusi yang paling efisien. Jika kita melakukan EXPLAIN
pada kedua pernyataan, kita mendapatkan hasil yang sama:
Pertanyaan 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
[Hasil] :
| 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 |
Pertanyaan 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
[Hasil] :
| 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 |
Anda dapat meninjau detail lengkapnya dengan tautan berikut. Saya juga membuat contoh SQL 2008 sehingga Anda dapat membandingkan cara kerja dua mesin (yang sama):
Contoh permintaan MySQL
Contoh kueri SQL 2008 (Pastikan Anda 'Lihat Rencana Eksekusi' untuk kedua hasil)
INNER JOIN
, tetapi denganLEFT JOIN
ini akan menghasilkan hasil yang berbeda. Pada dasarnya, kondisi yang Anda tambahkan padaWHERE
permintaan kedua Anda mengubah AndaJOIN
padaINNER JOIN