Kemerosotan Prestasi MySQL dengan Subquery dalam WHERE IN
Apabila cuba mengenal pasti dan memeriksa baris pendua dalam pangkalan data MySQL, pertanyaan yang kelihatan mudah terhasil dalam prestasi perlahan yang tidak dijangka. Pertanyaan awal, bertujuan untuk memilih semua baris dengan nilai pendua dalam lajur 'relevant_field', menggunakan struktur berikut:
SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1
Pertanyaan ini dilaksanakan dengan cepat, tetapi apabila pertanyaan berikutnya dibina untuk mendapatkan semula semua baris dalam 'some_table' dengan nilai 'relevant_field' yang sepadan dengan nilai dalam pertanyaan pertama, prestasi menurun secara mendadak.
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
Prestasi perlahan boleh dikaitkan dengan sifat subkueri sebagai pertanyaan berkorelasi. Dalam kes ini, subkueri dilaksanakan untuk setiap baris yang diproses oleh pertanyaan utama, mengakibatkan overhed yang berlebihan.
Untuk mengurangkan isu prestasi ini, adalah berfaedah untuk mengubah subkueri berkorelasi menjadi subkueri tidak berkorelasi dengan memilih semua lajur daripada subkueri.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Dengan membuat pengubahsuaian ini, prestasi pertanyaan utama dipertingkatkan dengan ketara.
SELECT * FROM some_table WHERE relevant_field IN ( SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery )
Pertanyaan yang disemak ini memanfaatkan keupayaan pengoptimuman MySQL untuk mendapatkan semula pendua dengan cekap baris tanpa penalti prestasi yang dikaitkan dengan subkueri berkorelasi asal.
Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL Saya dengan Subkueri di WHERE IN Sangat Lambat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!