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
Lepaskan: 2025-01-16 17:38:11
asal
966 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan