MySQL - SELECT WHERE Field IN (Subquery) Performance Drop
Dalam pangkalan data, mengesan baris pendua menggunakan subquery boleh menjadi pendekatan yang cekap . Walau bagaimanapun, apabila cuba mendapatkan semula semua baris dengan nilai medan pendua, pertanyaan WHERE IN (subquery) mungkin mengalami isu prestasi yang ketara. Memahami sebab kelembapan ini boleh membantu mengoptimumkan pertanyaan.
Subkueri Berkorelasi dan Kesannya
Punca penurunan prestasi dalam senario ini terletak pada penggunaan korelasi subqueries. Subkueri berkorelasi merujuk nilai daripada pertanyaan induknya, yang bermaksud subkueri dilaksanakan sekali untuk setiap baris yang diproses dalam pertanyaan induk. Dalam pertanyaan yang disediakan:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
Subquery mengembalikan nilai medan pendua dalam some_table. Apabila pertanyaan luar memproses setiap baris dalam some_table, ia membandingkan nilai medan_berkaitan dengan nilai yang dikembalikan oleh subquery. Memandangkan subkueri mengembalikan berbilang baris untuk setiap nilai medan pendua, perbandingan ini melibatkan pelaksanaan subkueri berbilang kali, yang membawa kepada masa pelaksanaan yang dilanjutkan.
Mengatasi Subkueri Berkorelasi
Untuk mengatasi isu prestasi yang disebabkan oleh subkueri berkorelasi, seseorang boleh menukar subkueri itu kepada pertanyaan tidak berkorelasi. Ini dicapai dengan memilih semua lajur dalam subkueri dan kemudian menggunakannya sebagai jadual dalam pertanyaan luar.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Dengan memilih semua lajur dalam subkueri, ia menjadi bebas daripada nilai dalam pertanyaan induk dan boleh dilaksanakan sekali untuk mengembalikan semua nilai medan pendua.
Pertanyaan Diubah Suai untuk Penambahbaikan Prestasi
Menggunakan subkueri tidak berkorelasi, pertanyaan diubah suai yang mendapatkan semula semua baris pendua dalam some_table sambil mengelakkan isu prestasi menjadi:
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 )
Pendekatan ini mengoptimumkan pertanyaan dengan berkesan dengan menghapuskan kelemahan prestasi yang dikaitkan dengan subkueri berkorelasi. Pertanyaan itu kini boleh mendapatkan semula baris pendua dengan cekap, membolehkan pemeriksaan dan analisis kemungkinan anomali data.
Atas ialah kandungan terperinci Mengapakah penggunaan `WHERE IN (Subquery)` membawa kepada isu prestasi dalam MySQL apabila mencari baris pendua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!