Rumah >pangkalan data >tutorial mysql >Mengapakah `IN` lebih perlahan daripada `=` dalam pertanyaan MySQL, walaupun dengan satu nilai?

Mengapakah `IN` lebih perlahan daripada `=` dalam pertanyaan MySQL, walaupun dengan satu nilai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-16 17:06:13382semak imbas

Why is `IN` slower than `=` in MySQL queries, even with a single value?

MySQL IN lwn. = Percanggahan Prestasi

Isu: 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!

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