Rumah > pangkalan data > tutorial mysql > Mengapa Pertanyaan MySQL Saya dengan Subkueri di WHERE IN Sangat Lambat?

Mengapa Pertanyaan MySQL Saya dengan Subkueri di WHERE IN Sangat Lambat?

Linda Hamilton
Lepaskan: 2024-11-15 15:54:03
asal
462 orang telah melayarinya

Why is My MySQL Query with a Subquery in WHERE IN So Slow?

Kemerosotan Prestasi MySQL dengan Subquery dalam WHERE IN

Apabila cuba mengenal pasti dan memeriksa baris pendua dalam pangkalan data MySQL, pertanyaan yang kelihatan mudah terhasil dalam prestasi perlahan yang tidak dijangka. Pertanyaan awal, bertujuan untuk memilih semua baris dengan nilai pendua dalam lajur 'relevant_field', menggunakan struktur berikut:

SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Salin selepas log masuk

Pertanyaan ini dilaksanakan dengan cepat, tetapi apabila pertanyaan berikutnya dibina untuk mendapatkan semula semua baris dalam 'some_table' dengan nilai 'relevant_field' yang sepadan dengan nilai dalam pertanyaan pertama, prestasi menurun secara mendadak.

SELECT *
FROM some_table 
WHERE relevant_field IN
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
)
Salin selepas log masuk

Prestasi perlahan boleh dikaitkan dengan sifat subkueri sebagai pertanyaan berkorelasi. Dalam kes ini, subkueri dilaksanakan untuk setiap baris yang diproses oleh pertanyaan utama, mengakibatkan overhed yang berlebihan.

Untuk mengurangkan isu prestasi ini, adalah berfaedah untuk mengubah subkueri berkorelasi menjadi subkueri tidak berkorelasi dengan memilih semua lajur daripada subkueri.

SELECT * FROM
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
) AS subquery
Salin selepas log masuk

Dengan membuat pengubahsuaian ini, prestasi pertanyaan utama dipertingkatkan dengan ketara.

SELECT *
FROM some_table
WHERE relevant_field IN
(
    SELECT * FROM
    (
        SELECT relevant_field
        FROM some_table
        GROUP BY relevant_field
        HAVING COUNT(*) > 1
    ) AS subquery
)
Salin selepas log masuk

Pertanyaan yang disemak ini memanfaatkan keupayaan pengoptimuman MySQL untuk mendapatkan semula pendua dengan cekap baris tanpa penalti prestasi yang dikaitkan dengan subkueri berkorelasi asal.

Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL Saya dengan Subkueri di WHERE IN Sangat Lambat?. 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