Rumah >pangkalan data >tutorial mysql >Mengapakah menggunakan \'IN\' dengan subkueri memperlahankan pertanyaan MySQL, tetapi tidak apabila menggunakan nilai eksplisit?
Pertanyaan MySQL yang perlahan dengan "IN" lwn. Nilai Eksplisit
Dalam MySQL, pengendali "IN" boleh menyebabkan kemerosotan prestasi yang ketara apabila disertakan oleh subkueri, walaupun ia berfungsi dengan pantas dengan nilai eksplisit.
Masalah
Pertimbangkan pertanyaan MySQL berikut:
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')
Walaupun terdapat subkueri dan pengindeksan lajur, pertanyaan ini mengambil masa lebih kurang 18 saat untuk dilaksanakan. Walau bagaimanapun, menggantikan hasil subkueri dengan nilai eksplisit mempercepatkan pertanyaan dengan ketara, menyelesaikan dalam masa kurang dari 1 milisaat:
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid in (24899,24900,24901,24902);
Penaakulan
Perbezaan prestasi berpunca daripada subkueri tingkah laku. Dalam MySQL, subkueri dinilai setiap kali ia dirujuk. Oleh itu, pertanyaan asal melaksanakan subkueri kira-kira 7 juta kali, menghasilkan prestasi yang lebih perlahan.
Penyelesaian
Untuk menangani isu ini, pertimbangkan untuk menggunakan JOIN dan bukannya subquery :
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data INNER JOIN em_link l ON em_link_data.linkid = l.id WHERE l.campaignid = '2900' AND l.link != 'open'
Pendekatan ini melaksanakan satu pertanyaan, meningkatkan prestasi dengan ketara.
Atas ialah kandungan terperinci Mengapakah menggunakan \'IN\' dengan subkueri memperlahankan pertanyaan MySQL, tetapi tidak apabila menggunakan nilai eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!