Rumah >pangkalan data >tutorial mysql >Mengapakah `IN` lebih perlahan daripada `=` dalam pertanyaan MySQL, walaupun dengan satu nilai?
IN
lwn. =
Percanggahan PrestasiIsu: Pertanyaan MySQL menggunakan operator IN
boleh menghairankan lebih perlahan daripada yang menggunakan operator =
, walaupun apabila IN
membandingkan dengan satu nilai.
Punca Punca: Masalahnya terletak pada cara MySQL mengendalikan subkueri dalam klausa IN
. Versi lama (sebelum 5.6) sering tersilap mengenal pasti subkueri ini sebagai bergantung subkueri.
Subkueri Bergantung vs. Bebas: Subkueri bergantung dilaksanakan semula untuk setiap baris dalam pertanyaan luar, yang membawa kepada overhed prestasi yang ketara. Subkueri bebas dilaksanakan sekali sahaja. Versi awal MySQL salah menganggap IN
subkueri sebagai bergantung, walaupun apabila mereka mengembalikan satu nilai.
Analisis JELAS: Perintah EXPLAIN
mendedahkan tingkah laku ini. Pertanyaan IN
dengan subkueri menunjukkan "SUBQUERY BERGANTUNG" dalam pelan pelaksanaan, manakala pertanyaan setara menggunakan =
menunjukkan "SUBQUERY".
Contoh EXPLAIN
output (menunjukkan isu):
<code>1 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 2 'DEPENDENT SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 3 'DEPENDENT SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'</code>
Contoh EXPLAIN
output (selepas membetulkan isu dengan =
):
<code>1 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 2 'SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where' 3 'SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'</code>
Contoh Ilustrasi:
Pertanyaan mudah ini menunjukkan masalah:
<code class="language-sql">SELECT id FROM foo WHERE id IN (SELECT MAX(foo_id) FROM bar);</code>
Walaupun dengan satu nilai yang dikembalikan oleh subkueri, ia dianggap sebagai bergantung, mengakibatkan pelaksanaan yang perlahan. Menggantikan IN
dengan =
meningkatkan prestasi secara mendadak.
Penyelesaian:
Isu prestasi telah ditangani dalam MySQL 5.6 dan versi yang lebih baru. Menaik taraf kepada versi yang lebih baharu menyelesaikan percanggahan ini. Jika peningkatan tidak dapat dilaksanakan, menulis semula pertanyaan untuk mengelakkan IN
dengan subkueri (menggunakan gabungan, sebagai contoh) boleh menjadi penyelesaian.
Atas ialah kandungan terperinci Mengapakah `IN` lebih perlahan daripada `=` dalam pertanyaan MySQL, walaupun dengan satu nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!