Sebab mengapa pengendali IN
lebih perlahan daripada pengendali =
dalam MySQL
Dalam sesetengah kes, syarat IN
dalam MySQL dilaksanakan lebih perlahan daripada syarat =
Ini adalah isu yang diketahui. Punca utamanya ialah apabila pengoptimum MySQL memproses subkueri dalam keadaan IN
, kadangkala ia tersilap mengenal pastinya sebagai subkueri bergantung dan bukannya subkueri bebas.
Oleh itu, subkueri dalam keadaan IN
dilaksanakan sekali untuk setiap baris dalam pertanyaan induk, manakala subkueri dalam keadaan =
dilaksanakan sekali sahaja. Ini boleh membawa kepada perbezaan prestasi yang ketara, terutamanya apabila bekerja dengan set data yang besar.
Mari kita lihat contoh pertanyaan SELECT
:
<code class="language-sql">SELECT * FROM question_law_version WHERE law_version IN (SELECT MAX(foo_id) FROM bar);</code>
Menggunakan EXPLAIN
untuk menganalisis pertanyaan ini, hasilnya mungkin kelihatan seperti ini:
<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>
"DEPENDENT SUBQUERY" menunjukkan bahawa subquery dalam keadaan IN
sedang dilaksanakan untuk setiap baris pertanyaan induk.
Jika kita menukar syarat IN
kepada =
:
<code class="language-sql">SELECT * FROM question_law_version WHERE law_version = (SELECT MAX(foo_id) FROM bar);</code>
EXPLAIN
akan menjadi:
<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>
Baris "SUBQUERY" menunjukkan bahawa subquery kini dilaksanakan sekali sahaja, menghasilkan pelaksanaan yang lebih pantas.
Isu ini telah diselesaikan dalam versi MySQL 5.6.x. Jika boleh, menaik taraf kepada versi MySQL yang lebih baharu boleh menyelesaikan isu ini dan memperoleh peningkatan prestasi.
Atas ialah kandungan terperinci Mengapakah `IN` lebih perlahan daripada `=` dalam subkueri MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!