Rumah > pangkalan data > tutorial mysql > Mengapakah penggunaan `WHERE IN (Subquery)` membawa kepada isu prestasi dalam MySQL apabila mencari baris pendua?

Mengapakah penggunaan `WHERE IN (Subquery)` membawa kepada isu prestasi dalam MySQL apabila mencari baris pendua?

Linda Hamilton
Lepaskan: 2024-11-22 10:20:10
asal
519 orang telah melayarinya

Why does using `WHERE IN (Subquery)` lead to performance issues in MySQL when searching for duplicate rows?

MySQL - SELECT WHERE Field IN (Subquery) Performance Drop

Dalam pangkalan data, mengesan baris pendua menggunakan subquery boleh menjadi pendekatan yang cekap . Walau bagaimanapun, apabila cuba mendapatkan semula semua baris dengan nilai medan pendua, pertanyaan WHERE IN (subquery) mungkin mengalami isu prestasi yang ketara. Memahami sebab kelembapan ini boleh membantu mengoptimumkan pertanyaan.

Subkueri Berkorelasi dan Kesannya

Punca penurunan prestasi dalam senario ini terletak pada penggunaan korelasi subqueries. Subkueri berkorelasi merujuk nilai daripada pertanyaan induknya, yang bermaksud subkueri dilaksanakan sekali untuk setiap baris yang diproses dalam pertanyaan induk. Dalam pertanyaan yang disediakan:

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

Subquery mengembalikan nilai medan pendua dalam some_table. Apabila pertanyaan luar memproses setiap baris dalam some_table, ia membandingkan nilai medan_berkaitan dengan nilai yang dikembalikan oleh subquery. Memandangkan subkueri mengembalikan berbilang baris untuk setiap nilai medan pendua, perbandingan ini melibatkan pelaksanaan subkueri berbilang kali, yang membawa kepada masa pelaksanaan yang dilanjutkan.

Mengatasi Subkueri Berkorelasi

Untuk mengatasi isu prestasi yang disebabkan oleh subkueri berkorelasi, seseorang boleh menukar subkueri itu kepada pertanyaan tidak berkorelasi. Ini dicapai dengan memilih semua lajur dalam subkueri dan kemudian menggunakannya sebagai jadual dalam pertanyaan luar.

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

Dengan memilih semua lajur dalam subkueri, ia menjadi bebas daripada nilai dalam pertanyaan induk dan boleh dilaksanakan sekali untuk mengembalikan semua nilai medan pendua.

Pertanyaan Diubah Suai untuk Penambahbaikan Prestasi

Menggunakan subkueri tidak berkorelasi, pertanyaan diubah suai yang mendapatkan semula semua baris pendua dalam some_table sambil mengelakkan isu prestasi menjadi:

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

Pendekatan ini mengoptimumkan pertanyaan dengan berkesan dengan menghapuskan kelemahan prestasi yang dikaitkan dengan subkueri berkorelasi. Pertanyaan itu kini boleh mendapatkan semula baris pendua dengan cekap, membolehkan pemeriksaan dan analisis kemungkinan anomali data.

Atas ialah kandungan terperinci Mengapakah penggunaan `WHERE IN (Subquery)` membawa kepada isu prestasi dalam MySQL apabila mencari baris pendua?. 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