Kesan Prestasi MySQL: Subquery dalam Klausa WHERE
Apabila berurusan dengan data pendua, adalah perlu untuk mengenal pasti dan memeriksa baris yang menyinggung perasaan. Walau bagaimanapun, pertanyaan mudah menggunakan subkueri dalam klausa WHERE boleh menghadapi isu prestasi yang ketara.
Pertanyaan Asal:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
Walaupun terdapat indeks pada medan_berkaitan, ini pertanyaan berfungsi dengan sangat perlahan. Sebabnya terletak pada sifat berkorelasi subkueri.
Subkueri Berkorelasi dan Prestasi:
Subkueri berkorelasi ialah subkueri yang merujuk lajur daripada pertanyaan luar. Dalam kes ini, subquery memilih nilai medan_berkaitan yang berlaku lebih daripada sekali dalam jadual. Untuk setiap baris dalam pertanyaan luar, subkueri dilaksanakan, membawa kepada berbilang pelaksanaan pertanyaan yang sama. Ini mengakibatkan prestasi yang lemah.
Subkueri Tidak Berkorelasi sebagai Penyelesaian:
Untuk menghapuskan isu prestasi, adalah disyorkan untuk mengubah subkueri berkorelasi menjadi tidak berkorelasi satu. Ini boleh dicapai dengan memilih semua lajur daripada subkueri dan memberikannya alias.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Pertanyaan Diubah Suai:
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 ini berfungsi dengan lebih pantas kerana subquery tidak lagi berkorelasi. Ia mengira nilai medan_berkaitan yang berlaku lebih daripada sekali dalam satu pelaksanaan dan menyimpannya dalam alias subkueri, yang kemudiannya digunakan dalam pertanyaan utama.
Kesimpulan:
Memahami perbezaan antara subkueri berkorelasi dan tidak berkorelasi adalah penting untuk mengoptimumkan prestasi MySQL. Dengan menukar subkueri berkorelasi kepada tidak berkorelasi, anda boleh meningkatkan kelajuan pertanyaan dengan ketara yang bergantung pada subkueri dalam klausa WHERE.
Atas ialah kandungan terperinci Mengapa Menggunakan Subquery dalam Klausa WHERE Sangat Lambat dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!