Rumah >pangkalan data >tutorial mysql >Mengapakah subkueri MySQL saya dalam klausa IN menyebabkan masalah prestasi?

Mengapakah subkueri MySQL saya dalam klausa IN menyebabkan masalah prestasi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-29 05:22:25662semak imbas

Why is my MySQL subquery in an IN clause causing performance issues?

MySQL - Korelasi Subkueri Melambatkan Prestasi Klausa

Pertanyaan yang diberikan, yang mengenal pasti baris pendua dalam jadual pangkalan data menggunakan subquery dalam Klausa IN, sedang mengalami masalah prestasi yang ketara. Walaupun subkueri itu sendiri dilaksanakan dengan cepat, pertanyaan klausa IN mengambil masa yang agak lama.

Sebab Kelambatan

Kelembaban disebabkan oleh sifat berkorelasi subkueri. Dalam pertanyaan berkorelasi, subkueri merujuk lajur daripada pertanyaan luar, menjadikannya bergantung pada pelaksanaan pertanyaan luar. Akibatnya, setiap baris dalam jadual luar mencetuskan pelaksanaan subkueri yang berasingan.

Penyelesaian

Untuk menyelesaikan isu, subkueri berkorelasi boleh ditukar menjadi subkueri tidak berkorelasi dengan memilih semua lajur di dalamnya. Ini menghapuskan pergantungan pada pertanyaan luar, meningkatkan prestasi dengan ketara:

SELECT * FROM
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
) AS subquery

Pertanyaan Akhir

Pertanyaan yang diubah suai akan kelihatan seperti ini:

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
)

Pertanyaan tidak berkorelasi ini akan dilaksanakan lebih cepat daripada pertanyaan berkorelasi asal.

Atas ialah kandungan terperinci Mengapakah subkueri MySQL saya dalam klausa IN menyebabkan masalah prestasi?. 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