Rumah >pangkalan data >tutorial mysql >Mengapakah subkueri MySQL saya dalam klausa IN menyebabkan masalah prestasi?
MySQL - Korelasi Subkueri Melambatkan Prestasi Klausa
Pertanyaan yang diberikan, yang mengenal pasti baris pendua dalam jadual pangkalan data menggunakan subquery dalam Klausa IN, sedang mengalami masalah prestasi yang ketara. Walaupun subkueri itu sendiri dilaksanakan dengan cepat, pertanyaan klausa IN mengambil masa yang agak lama.
Sebab Kelambatan
Kelembaban disebabkan oleh sifat berkorelasi subkueri. Dalam pertanyaan berkorelasi, subkueri merujuk lajur daripada pertanyaan luar, menjadikannya bergantung pada pelaksanaan pertanyaan luar. Akibatnya, setiap baris dalam jadual luar mencetuskan pelaksanaan subkueri yang berasingan.
Penyelesaian
Untuk menyelesaikan isu, subkueri berkorelasi boleh ditukar menjadi subkueri tidak berkorelasi dengan memilih semua lajur di dalamnya. Ini menghapuskan pergantungan pada pertanyaan luar, meningkatkan prestasi dengan ketara:
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Pertanyaan Akhir
Pertanyaan yang diubah suai akan kelihatan seperti ini:
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 tidak berkorelasi ini akan dilaksanakan lebih cepat daripada pertanyaan berkorelasi asal.
Atas ialah kandungan terperinci Mengapakah subkueri MySQL saya dalam klausa IN menyebabkan masalah prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!