Subkueri dengan EXISTS vs IN: Pengoptimuman Prestasi
Apabila bekerja dengan subkueri, pengoptimuman prestasi adalah penting. Dua kaedah subquery biasa ialah EXISTS dan IN, masing-masing mempunyai kelebihan dan kelemahan tersendiri. Dalam siaran ini, kami akan meneroka perbezaan utama antara kaedah ini dan menunjukkan kesan prestasinya.
Pernyataan Masalah
Dua subkueri berikut adalah semantik, tetapi Kaedah 1 mengambil masa yang lebih lama untuk dilaksanakan daripada Kaedah 2:
Kaedah 1 (Menggunakan DALAM)
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 (Menggunakan EXISTS)
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 ) )
Perbezaan Prestasi
Oleh menganalisis Rancangan Terangkan, kita boleh memahami mengapa Kaedah 2 lebih pantas. Perbezaan utama terletak pada cara kaedah ini mengendalikan subkueri:
Kelebihan EXISTS
Menggunakan EXISTS menawarkan beberapa kelebihan berbanding IN, terutamanya apabila berurusan dengan hasil subkueri yang besar:
Kelebihan IN
Walaupun EXISTS pada umumnya lebih berprestasi, IN mungkin diutamakan dalam senario tertentu:
Kesimpulan
Dalam kebanyakan kes, EXISTS ialah kaedah pilihan untuk subkueri kerana kelebihan prestasinya dan pengendalian nilai NULL. Walau bagaimanapun, adalah penting untuk mempertimbangkan kes penggunaan dan saiz subkueri tertentu apabila memilih antara EXISTS dan IN untuk mengoptimumkan prestasi dan kecekapan pertanyaan.
Atas ialah kandungan terperinci EXISTS lwn. IN Subqueries: Bagaimanakah Saya Boleh Mengoptimumkan Prestasi Pertanyaan SQL Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!