MySQL: Join mana yang lebih baik antara join luar kiri dan join dalam

10

Gabung mana yang lebih baik jika semuanya memberikan hasil yang sama? Sebagai contoh, saya punya dua tabel employees(emp_id,name, address, designation, age, sex)dan work_log(emp_id,date,hours_wored). Untuk mendapatkan beberapa hasil spesifik baik inner joindan left joinmemberikan hasil yang sama. Namun, saya masih memiliki beberapa keraguan yang tidak terbatas pada pertanyaan ini saja.

  • yang bergabung lebih efisien mana yang lebih suka jika nilai hasil yang sama?
  • Apa faktor lain yang harus dipertimbangkan pada saat mendaftar bergabung?
  • Apakah ada hubungan antara inner join dan cross join?
ursitesion
sumber

Jawaban:

14

Tidak ada tipe gabungan "lebih baik" atau "lebih buruk". Mereka memiliki arti yang berbeda dan mereka harus digunakan tergantung padanya.

Dalam kasus Anda, Anda mungkin tidak memiliki karyawan tanpa work_log (tidak ada baris dalam tabel itu), jadi LEFT JOINdan JOINhasilnya akan setara. Namun, jika Anda memiliki hal seperti itu (karyawan baru tanpa work_log terdaftar), JOINhapus karyawan itu, sedangkan yang kiri bergabung (yang tabel pertamanya adalah karyawan) akan menunjukkan semuanya, dan nol di bidang dari work_log jika ada tidak cocok.

Penjelasan visual tentang tipe JOIN

Sekali lagi, kinerja adalah hal sekunder untuk kebenaran permintaan. Beberapa orang mengatakan bahwa Anda tidak boleh menggunakan LEFT JOINs. Memang benar bahwa LEFT JOIN memaksa optimizer untuk mengeksekusi query dalam satu urutan tertentu, mencegah beberapa optimisasi (pemesanan ulang tabel) dalam beberapa kasus. Ini salah satu contohnya . Tetapi Anda tidak boleh memilih satu dari yang lain jika kebenaran / makna dikorbankan, karena INNER JOIN tidak secara inheren lebih buruk. Sisa dari optimasi yang biasa berlaku seperti biasa.

Singkatnya, jangan gunakan LEFT JOINjika Anda benar-benar jahat INNER JOIN.

Di MySQL CROSS JOIN, INNER JOINdan JOINsama. Dalam standar, dan secara semantik, a CROSS JOINadalah INNER JOINtanpa ONklausa, sehingga Anda mendapatkan setiap kombinasi baris di antara tabel.

Anda memiliki contoh semua jenis semantik bergabung di Wikipedia . Dalam praktiknya, di MySQL, kita cenderung hanya menulis JOINdan LEFT JOIN.

jynus
sumber
1
Penjelasan Gr8 @ jynus. Beruntung saya mendapat jawaban dari pertanyaan saya ini hanya dari Anda.
ursitesion
1 grafik yang relevan lebih baik dari 1000 kata. Apa kau berhasil melakukannya?
Fr0zenFyr
Tidak, saya tidak tahu, atribusi ada di bagian bawah codeproject.com/Articles/33052/… - Meskipun menggunakan diagram venn untuk mewakili gabungan sama tuanya dengan formalisasi aljabarnya: en.wikipedia.org/wiki/Relational_algebra
jynus
Saya mulai dengan serangkaian komentar kemudian menyadari semuanya bermuara pada - itu tergantung pada permintaan Anda. +1 dari saya!
iheanyi
0

Gabung mana yang lebih baik kinerjanya jika semuanya memberikan hasil yang sama?

Saya menambahkan jawaban sebelumnya, untuk apa yang saya tahu, MySQL dioptimalkan untuk memiliki kinerja yang sama.

Dengan indeks yang baik, misalnya, JOINvs LEFT JOIN+ WHEREklausa untuk memfilter, akan menjadi hal yang sama. Pengoptimalan vs Membaca Manusia masuk akal pada pertanyaan besar dengan banyak bergabung.

Menggunakan indeks dan cache yang baik lebih penting.

Anda dapat membaca penjelasan yang bagus tentang proses optimasi di sini:

Proses Optimasi Kueri : Permintaan sering kali dapat dijalankan dengan berbagai cara dan menghasilkan hasil yang sama. Tugas pengoptimal adalah menemukan opsi terbaik.

Shim-Sao
sumber