Rumah > pangkalan data > tutorial mysql > Mengapakah menggunakan \'IN\' dengan subkueri memperlahankan pertanyaan MySQL, tetapi tidak apabila menggunakan nilai eksplisit?

Mengapakah menggunakan \'IN\' dengan subkueri memperlahankan pertanyaan MySQL, tetapi tidak apabila menggunakan nilai eksplisit?

Barbara Streisand
Lepaskan: 2024-10-30 04:10:02
asal
1094 orang telah melayarinya

Why does using

Pertanyaan MySQL yang perlahan dengan "IN" lwn. Nilai Eksplisit

Dalam MySQL, pengendali "IN" boleh menyebabkan kemerosotan prestasi yang ketara apabila disertakan oleh subkueri, walaupun ia berfungsi dengan pantas dengan nilai eksplisit.

Masalah

Pertimbangkan pertanyaan MySQL berikut:

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

Walaupun terdapat subkueri dan pengindeksan lajur, pertanyaan ini mengambil masa lebih kurang 18 saat untuk dilaksanakan. Walau bagaimanapun, menggantikan hasil subkueri dengan nilai eksplisit mempercepatkan pertanyaan dengan ketara, menyelesaikan dalam masa kurang dari 1 milisaat:

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (24899,24900,24901,24902);
Salin selepas log masuk

Penaakulan

Perbezaan prestasi berpunca daripada subkueri tingkah laku. Dalam MySQL, subkueri dinilai setiap kali ia dirujuk. Oleh itu, pertanyaan asal melaksanakan subkueri kira-kira 7 juta kali, menghasilkan prestasi yang lebih perlahan.

Penyelesaian

Untuk menangani isu ini, pertimbangkan untuk menggunakan JOIN dan bukannya subquery :

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
INNER JOIN em_link l
ON em_link_data.linkid = l.id
WHERE
l.campaignid = '2900' AND l.link != 'open'
Salin selepas log masuk

Pendekatan ini melaksanakan satu pertanyaan, meningkatkan prestasi dengan ketara.

Atas ialah kandungan terperinci Mengapakah menggunakan \'IN\' dengan subkueri memperlahankan pertanyaan MySQL, tetapi tidak apabila menggunakan nilai eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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