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

Mengapakah pengendali `IN` MySQL lebih perlahan daripada `=` walaupun dengan satu nilai?

Linda Hamilton
Linda Hamiltonasal
2025-01-16 17:38:11969semak imbas

Why is MySQL's `IN` operator slower than `=` even with a single value?

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

  • Subkueri bergantung: Untuk setiap baris dalam pertanyaan luar, subkueri bergantung dilaksanakan sekali, menghasilkan berbilang pengiraan.
  • Subkueri bebas: dilaksanakan sekali sahaja, tanpa mengira bilangan baris dalam pertanyaan luar.

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:

  • Dalam Keadaan:
    • 'PRIMER' 'versi_undang_soalan' 'SEMUA' '' '' '' 10148 'Menggunakan di mana'
    • 'SUBQUERY BERGANTUNG' 'versi_undang_soalan' 'SEMUA' '' '' '' 10148 'Menggunakan di mana'
    • 'SUBQUERY BERGANTUNG' 'undang_soalan' 'SEMUA' '' '' '' 10040 'Menggunakan di mana'
  • Keadaan tanda sama:
    • 'PRIMER' 'versi_undang_soalan' 'SEMUA' '' '' '' 10148 'Menggunakan di mana'
    • 'SUBQUERY' 'versi_undang_soalan' 'SEMUA' '' '' '' 10148 'Menggunakan di mana'
    • 'SUBQUERY' 'undang_soalan' 'SEMUA' '' '' '' '' 10040 'Menggunakan di mana'

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!

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