Rumah >pangkalan data >tutorial mysql >Mengapakah Keadaan `IN` SQL Kadangkala Lebih Lambat Daripada Operator `=`?
Keadaan IN
SQL: Isu Prestasi Berbanding =
Dalam situasi tertentu, keadaan IN
SQL boleh berprestasi rendah dengan ketara berbanding pengendali =
. Ini adalah isu yang ketara dalam versi MySQL yang lebih lama, walaupun versi kemudian (MySQL 5.6 dan seterusnya) telah menangani perkara ini.
Perbezaan prestasi berpunca daripada cabaran pengoptimuman. Subkueri dalam klausa IN
mungkin salah dikenal pasti sebagai bergantung, bukannya bebas. Ini membawa kepada pelaksanaan berulang subkueri untuk setiap baris dalam pertanyaan utama, memberi kesan secara dramatik pada prestasi.
Mari kita lihat contoh:
<code class="language-sql">SELECT * FROM question_law_version WHERE question_law_id IN ( SELECT MAX(foo_id) FROM bar );</code>
Pelan EXPLAIN
untuk pertanyaan ini mungkin mendedahkan:
<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>
Perhatikan sebutan "SUBQUERY BERGANTUNG". Pertanyaan dalaman berulang kali dilaksanakan. Walau bagaimanapun, menulis semula pertanyaan menggunakan =
(dengan mengandaikan subkueri mengembalikan nilai tunggal):
<code class="language-sql">SELECT * FROM question_law_version WHERE question_law_id = ( SELECT MAX(foo_id) FROM bar );</code>
...selalunya menghasilkan rancangan yang lebih cekap:
<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>
Perbezaan utama ialah klasifikasi "SUBQUERY", yang menunjukkan satu pelaksanaan. Percanggahan prestasi ini timbul daripada salah tafsiran MySQL (dalam versi lama) terhadap pergantungan subkueri klausa IN
. Pengendalian pangkalan data yang tidak cekap ini membawa kepada kelembapan prestasi.
Atas ialah kandungan terperinci Mengapakah Keadaan `IN` SQL Kadangkala Lebih Lambat Daripada Operator `=`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!