Subqueries dengan EXISTS vs IN dalam MySQL: Pengoptimuman Prestasi
Apabila bekerja dengan subqueries dalam MySQL, terdapat dua pendekatan biasa: menggunakan IN operator dan menggunakan operator EXISTS. Walaupun kedua-dua kaedah boleh mencapai hasil yang serupa, ia boleh menunjukkan perbezaan yang ketara dalam prestasi.
Pertimbangkan dua contoh subkueri berikut:
Kaedah 1 (IN):
SELECT * FROM tracker WHERE reservation_id IN ( SELECT reservation_id FROM tracker GROUP BY reservation_id HAVING ( method = 1 AND type = 0 AND Count(*) > 1 ) OR ( method = 1 AND type = 1 AND Count(*) > 1 ) OR ( method = 2 AND type = 2 AND Count(*) > 0 ) OR ( method = 3 AND type = 0 AND Count(*) > 0 ) OR ( method = 3 AND type = 1 AND Count(*) > 1 ) OR ( method = 3 AND type = 3 AND Count(*) > 0 ) )
Kaedah 2 (WUJUD):
SELECT * FROM `tracker` t WHERE EXISTS ( SELECT reservation_id FROM `tracker` t3 WHERE t3.reservation_id = t.reservation_id GROUP BY reservation_id HAVING ( METHOD = 1 AND TYPE = 0 AND COUNT(*) > 1 ) OR ( METHOD = 1 AND TYPE = 1 AND COUNT(*) > 1 ) OR ( METHOD = 2 AND TYPE = 2 AND COUNT(*) > 0 ) OR ( METHOD = 3 AND TYPE = 0 AND COUNT(*) > 0 ) OR ( METHOD = 3 AND TYPE = 1 AND COUNT(*) > 1 ) OR ( METHOD = 3 AND TYPE = 3 AND COUNT(*) > 0 ) )
Seperti yang dinyatakan dalam pernyataan masalah, Kaedah 1 mengambil masa yang lebih lama untuk dilaksanakan berbanding Kaedah 2. Ini disebabkan perbezaan asas dalam cara kedua-dua pendekatan mengendalikan subkueri.
IN Operator:
Apabila menggunakan operator IN, MySQL melaksanakan subquery beberapa kali, sekali untuk setiap baris dalam pertanyaan utama. Dalam kes ini, bagi setiap baris dalam jadual penjejak, subquery dilaksanakan untuk menentukan sama ada ia memenuhi kriteria yang ditentukan. Ini boleh membawa kepada overhed prestasi yang ketara, terutamanya jika subkueri adalah kompleks atau mengandungi sejumlah besar data.
WUJUD Operator:
Sebaliknya, pengendali EXISTS melaksanakan subkueri sekali sahaja. Ia menyemak sama ada terdapat sekurang-kurangnya satu baris yang sepadan dalam hasil subkueri untuk baris semasa dalam pertanyaan utama. Jika terdapat padanan, keadaan EXISTS dinilai sebagai benar; jika tidak, ia adalah palsu. Pendekatan ini adalah lebih cekap kerana ia mengelakkan keperluan untuk mendapatkan semula semua baris daripada subkueri beberapa kali.
Memilih Antara IN dan WUJUD:
Secara amnya, ia adalah disyorkan untuk menggunakan operator EXISTS apabila boleh, kerana ia memberikan prestasi yang lebih baik dalam kebanyakan kes. Berikut ialah beberapa garis panduan untuk membantu anda membuat pilihan yang tepat:
Pertimbangan Tambahan:
Atas ialah kandungan terperinci Subqueries MySQL: Bilakah Saya Perlu Menggunakan EXISTS vs. IN untuk Prestasi Optimum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!