Rumah >pangkalan data >tutorial mysql >Mengapa pertanyaan WHERE IN (subquery) saya lambat, tetapi merujuk pandangan daripada subquery adalah pantas?

Mengapa pertanyaan WHERE IN (subquery) saya lambat, tetapi merujuk pandangan daripada subquery adalah pantas?

DDD
DDDasal
2024-11-19 21:40:03516semak imbas

Why is my WHERE IN (subquery) query slow, but referencing a view from the subquery is fast?

MySQL Performance Conundrum: Subquery Performance Anomaly

Apabila cuba mendapatkan semula rekod pendua daripada pangkalan data, pertanyaan SQL menggunakan subquery untuk mengenal pasti baris yang berkaitan mempamerkan perbezaan prestasi yang mengejutkan.

The pertanyaan awal, mengasingkan rekod pendua dengan berkesan dengan mengumpulkan dan menapis pada medan tertentu, dilaksanakan dengan pantas. Walau bagaimanapun, pertanyaan seterusnya yang ingin mendapatkan semula semua baris dengan nilai yang sepadan dengan set pendua (dicapai menggunakan konstruk WHERE ... IN (subquery)) menjadi sangat perlahan.

Walaupun wujudnya indeks pada bidang yang berkaitan, pelaksanaan mengambil masa beberapa minit untuk diselesaikan. Mengesyaki pengehadan pangkalan data, pandangan telah dibuat daripada subkueri dan pertanyaan induk telah diubah suai untuk merujuk paparan sebaliknya. Ini mengakibatkan pelaksanaan hampir serta-merta.

Menyingkap Penyebabnya: Masalah Pertanyaan Berkorelasi

Setelah disiasat, didapati bahawa prestasi perlahan itu berpunca daripada sifat berkorelasi subquery. Dalam subkueri berkorelasi, pertanyaan dalam merujuk medan daripada pertanyaan luar, menyebabkan subkueri dilaksanakan beberapa kali untuk setiap baris dalam pertanyaan luar, menyebabkan kecekapan berkurangan.

Menyelesaikan Bottleneck: Mengasingkan Subquery

Untuk mengurangkan penalti prestasi, hubungan subquery telah diubah menjadi subquery yang tidak berkorelasi dengan memilih semua lajur daripada subquery dan memberikannya alias. Ini memastikan pelaksanaan subkueri sekali sahaja, meningkatkan prestasi pertanyaan dengan ketara.

Pertanyaan induk yang diubah suai, kini merujuk hasil subkueri tidak berkorelasi, dilaksanakan dengan kecekapan yang diingini, menyelesaikan isu prestasi.

Atas ialah kandungan terperinci Mengapa pertanyaan WHERE IN (subquery) saya lambat, tetapi merujuk pandangan daripada subquery adalah pantas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn