Saya mencoba membandingkan dua pertanyaan:
Pertanyaan 1:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d AND tableA.e=tableB.e
Pertanyaan 2:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d
WHERE tableA.e=tableB.e
Apakah saya berhak mengatakan bahwa kedua pertanyaan ini memberikan hasil yang sama?
Lebih lanjut, apakah benar mengatakan bahwa permintaan pertama membangun tabel yang lebih besar untuk melakukan WHERE
kondisi yang lebih besar ; sedangkan kasus kedua kita memiliki tabel yang dibangun lebih kecil yang WHERE
kemudian diterapkan sederhana .
Dengan asumsi hasilnya sama, kueri mana yang lebih disukai? Apakah ada masalah kinerja yang jelas?
mysql
performance
Geoff
sumber
sumber
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
INNER JOIN
pertanyaan saya tentang kinerja tetap valid?ON
dan menyaring kriteria diWHERE
.Jawaban:
Jika kami menganggap bahwa Anda menggunakan
INNER JOIN
alih-alihLEFT JOIN
(yang tampaknya adalah maksud Anda), kedua kueri ini secara fungsional setara. Pengoptimal permintaan akan meninjau dan mengevaluasi kriteria dalamWHERE
klausa Anda dan klausa AndaFROM
dan mempertimbangkan semua faktor ini ketika membangun rencana kueri untuk mencapai rencana eksekusi yang paling efisien. Jika kita melakukanEXPLAIN
pada kedua pernyataan, kita mendapatkan hasil yang sama:Pertanyaan 1 :
[Hasil] :
Pertanyaan 2 :
[Hasil] :
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)
sumber
INNER JOIN
bukanLEFT JOIN
dan saya mendapatkan hasil yang sama dalam sepersepuluh waktu. Saya rasa saya tahu mengapa saya mendapatkan output yang sama, tetapi mengapaINNER JOIN
kinerja yang lebih baik?LEFT JOIN
gabungan luar, itu tidak dapat membatasi set data di sisi pengembalian penuh set dan akan mencoba untuk mengambil semua baris dari tabel itu (dalam hal ini, TableA). Jika Anda menggunakanINNER JOIN
, itu dapat memanfaatkan kriteria itu di kedua tabel dan membatasi set data, sehingga memberikan pengembalian yang lebih cepat.