Rumah >pangkalan data >tutorial mysql >Subquery lwn. Joins: Mengapa Menggantikan Subquery dengan Join Menghasilkan Peningkatan Prestasi 100x ganda?
Pengoptimuman Pertanyaan: Kesan Dramatik Menggantikan Subkueri dengan Sertaan
Aplikasi baru-baru ini memfaktorkan semula prestasi yang meningkat secara mendadak dengan menggantikan subkueri dengan sambung dalam. Kod asal menggunakan subkueri dalam klausa WHERE
:
<code class="language-sql">WHERE id IN (SELECT id FROM ...)</code>
Perubahan itu menghasilkan kelajuan 100x yang menakjubkan, mengurangkan masa pelaksanaan daripada 50 saat kepada 0.3 saat. Ini menimbulkan persoalan: mengapa perbezaan yang begitu besar?
Kuncinya terletak pada memahami tingkah laku subkueri. Subkueri berkorelasi—di mana klausa WHERE
subkueri bergantung pada nilai pertanyaan luar—dilaksanakan berulang kali untuk setiap baris dalam pertanyaan luar. Pelaksanaan berulang ini amat tidak cekap. Sebaliknya, subkueri tidak berkorelasi dilaksanakan sekali sahaja.
Subkueri asal dikaitkan. Untuk setiap baris yang diproses, pangkalan data perlu melaksanakan subkueri, yang membawa kepada banyak carian.
Menggantikan subkueri dengan cantuman dalaman membolehkan pangkalan data memanfaatkan carian indeks dengan cekap. Syarat sertai (cth., submission_id = st_tag_id
) dibenarkan untuk carian diindeks tunggal bagi setiap baris yang layak. Ini secara drastik mengurangkan akses pangkalan data, menerangkan lonjakan prestasi.
Pelajarannya? Pertimbangan berhati-hati terhadap subkueri berbanding gabungan adalah penting untuk pengoptimuman pertanyaan SQL. Memahami subkueri berkorelasi dan tidak berkorelasi serta implikasi prestasinya, memberi kuasa kepada pembangun untuk menulis pertanyaan pangkalan data dengan lebih pantas dan cekap dengan ketara.
Atas ialah kandungan terperinci Subquery lwn. Joins: Mengapa Menggantikan Subquery dengan Join Menghasilkan Peningkatan Prestasi 100x ganda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!