Pengecualian prestasi pertanyaan MySQL: perbezaan prestasi antara operator IN dan operator tanda sama
Huraian Masalah
Dalam MySQL, prestasi pertanyaan SELECT menggunakan keadaan IN adalah jauh lebih rendah daripada pertanyaan yang sama menggunakan operator tanda sama (=). Walaupun keadaan IN mengandungi hanya satu nilai, perbezaan prestasi boleh menjadi ketara.
Penjelasan
Isu ini berpunca daripada kecacatan pengoptimuman dalam MySQL yang telah diperbaiki dalam MySQL 5.6.x. Masalah ini berlaku apabila subkueri yang mengandungi keadaan IN salah diklasifikasikan sebagai subkueri bergantung dan bukannya subkueri bebas.
Subkueri bergantung dan subkueri bebas
Sampel analisis pertanyaan
Contoh pertanyaan berikut menunjukkan anomali ini:
<code class="language-sql">SELECT * FROM question_law_version WHERE id IN ( SELECT MAX(foo_id) FROM bar )</code>
Apabila melaksanakan pertanyaan ini, subkueri dianggap sebagai subkueri bergantung, mengakibatkan prestasi yang lemah. Walau bagaimanapun, menggantikan IN dengan = menghilangkan kebergantungan dan meningkatkan prestasi dengan ketara.
Perbandingan pelan pertanyaan
Memeriksa pelan pertanyaan menggunakan arahan EXPLAIN mendedahkan perbezaannya:
Sila ambil perhatian bahawa tiada "SUBQUERY BERGANTUNG" dalam pelan pertanyaan menggunakan operator =.
Atas ialah kandungan terperinci Mengapakah pengendali `IN` MySQL lebih perlahan daripada `=` walaupun dengan satu nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!