Mengapakah pertanyaan MySQL \'IN\' dengan subkueri jauh lebih perlahan berbanding dengan nilai eksplisit?

Barbara Streisand
Lepaskan: 2024-10-31 02:09:02
asal
627 orang telah melayarinya

 Why is a MySQL

Jurang Prestasi Antara Subkueri dan Pertanyaan "IN" Nilai Eksplisit

Mengapa pertanyaan "IN" MySQL jauh lebih perlahan apabila menggunakan subkueri daripada apabila menggunakan nilai eksplisit?

Pertimbangkan pertanyaan berikut:

<code class="sql">SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid IN (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')</code>
Salin selepas log masuk

Pertanyaan ini mengambil masa kira-kira 18 saat untuk dilaksanakan, walaupun hakikatnya subkueri sahaja selesai dalam masa kurang dari 1ms.

Walau bagaimanapun, apabila subkueri digantikan dengan nilai eksplisit:

<code class="sql">SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid IN (24899,24900,24901,24902);</code>
Salin selepas log masuk

Pertanyaan selesai dalam masa kurang daripada 1 milisaat.

Penjelasan

Percanggahan prestasi timbul daripada cara MySQL menilai subkueri. Subquery dilaksanakan setiap kali ia ditemui, yang bermaksud bahawa dalam pertanyaan pertama, MySQL pada asasnya melaksanakan tujuh juta pertanyaan (penilaian subquery untuk setiap baris dalam jadual "em_link_data"). Sebaliknya, apabila menggunakan nilai eksplisit, subkueri dinilai sekali sahaja.

Penyelesaian

Jika menulis semula pertanyaan menggunakan JOIN bukan satu pilihan, anda boleh mempertimbangkan untuk menggunakan cache pertanyaan untuk meningkatkan prestasi. Cache pertanyaan menyimpan hasil pertanyaan yang dilaksanakan sebelum ini dan menggunakannya semula jika pertanyaan yang sama dilaksanakan semula. Ini boleh mengurangkan dengan ketara masa pelaksanaan pertanyaan berat subkueri.

Untuk mendayakan cache pertanyaan, tambah baris berikut pada fail konfigurasi MySQL anda:

query_cache_type = 1
Salin selepas log masuk

Mulakan semula MySQL untuk perubahan kepada berkuat kuasa.

Atas ialah kandungan terperinci Mengapakah pertanyaan MySQL \'IN\' dengan subkueri jauh lebih perlahan berbanding dengan nilai eksplisit?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!