MySQL, serta semua sistem lain kecuali SQL Server, dapat mengoptimalkan LEFT JOIN
/IS NULL
mengembalikan FALSE
segera setelah nilai yang cocok ditemukan, dan itu adalah satu-satunya sistem yang peduli untuk mendokumentasikan perilaku ini. [...] Karena MySQL tidak dapat menggunakan HASH
dan MERGE
bergabung dengan algoritma, satu-satunya ANTI JOIN
yang mampu adalahNESTED LOOPS ANTI JOIN
[...]
Pada dasarnya, [ NOT IN
] adalah persis rencana yang sama yang LEFT JOIN
/ IS NULL
kegunaan, meskipun fakta rencana ini dijalankan oleh cabang yang berbeda dari kode dan mereka terlihat berbeda dalam hasil EXPLAIN
. Algoritma pada kenyataannya sama dan kueri lengkap pada saat yang sama.
[...]
Sulit untuk mengatakan alasan yang tepat untuk [penurunan kinerja saat menggunakan NOT EXISTS
] , karena penurunan ini linear dan tampaknya tidak bergantung pada distribusi data, jumlah nilai di kedua tabel, dll., Selama kedua bidang diindeks. Karena ada tiga bagian kode di MySQL yang pada dasarnya melakukan satu pekerjaan, ada kemungkinan bahwa kode yang bertanggung jawab untuk EXISTS
membuat semacam pemeriksaan tambahan yang membutuhkan waktu ekstra.
[...]
MySQL dapat mengoptimalkan ketiga metode untuk melakukan semacam NESTED LOOPS ANTI JOIN
. […] Namun, ketiga metode ini menghasilkan tiga paket berbeda yang dijalankan oleh tiga kode berbeda. Kode yang mengeksekusi EXISTS
predikat sekitar 30% kurang efisien [...]
Itu sebabnya cara terbaik untuk mencari nilai yang hilang di MySQL menggunakan a LEFT JOIN
/ IS NULL
atau NOT IN
bukan NOT EXISTS
.
(penekanan ditambahkan)