Rumah > pangkalan data > tutorial mysql > Mengapa Menggunakan Subquery dalam Klausa WHERE Sangat Lambat dalam MySQL?

Mengapa Menggunakan Subquery dalam Klausa WHERE Sangat Lambat dalam MySQL?

Mary-Kate Olsen
Lepaskan: 2024-11-22 16:09:11
asal
645 orang telah melayarinya

Why Is Using a Subquery in the WHERE Clause So Slow in MySQL?

Kesan Prestasi MySQL: Subquery dalam Klausa WHERE

Apabila berurusan dengan data pendua, adalah perlu untuk mengenal pasti dan memeriksa baris yang menyinggung perasaan. Walau bagaimanapun, pertanyaan mudah menggunakan subkueri dalam klausa WHERE boleh menghadapi isu prestasi yang ketara.

Pertanyaan Asal:

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

Walaupun terdapat indeks pada medan_berkaitan, ini pertanyaan berfungsi dengan sangat perlahan. Sebabnya terletak pada sifat berkorelasi subkueri.

Subkueri Berkorelasi dan Prestasi:

Subkueri berkorelasi ialah subkueri yang merujuk lajur daripada pertanyaan luar. Dalam kes ini, subquery memilih nilai medan_berkaitan yang berlaku lebih daripada sekali dalam jadual. Untuk setiap baris dalam pertanyaan luar, subkueri dilaksanakan, membawa kepada berbilang pelaksanaan pertanyaan yang sama. Ini mengakibatkan prestasi yang lemah.

Subkueri Tidak Berkorelasi sebagai Penyelesaian:

Untuk menghapuskan isu prestasi, adalah disyorkan untuk mengubah subkueri berkorelasi menjadi tidak berkorelasi satu. Ini boleh dicapai dengan memilih semua lajur daripada subkueri dan memberikannya alias.

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

Pertanyaan Diubah Suai:

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 ini berfungsi dengan lebih pantas kerana subquery tidak lagi berkorelasi. Ia mengira nilai medan_berkaitan yang berlaku lebih daripada sekali dalam satu pelaksanaan dan menyimpannya dalam alias subkueri, yang kemudiannya digunakan dalam pertanyaan utama.

Kesimpulan:

Memahami perbezaan antara subkueri berkorelasi dan tidak berkorelasi adalah penting untuk mengoptimumkan prestasi MySQL. Dengan menukar subkueri berkorelasi kepada tidak berkorelasi, anda boleh meningkatkan kelajuan pertanyaan dengan ketara yang bergantung pada subkueri dalam klausa WHERE.

Atas ialah kandungan terperinci Mengapa Menggunakan Subquery dalam Klausa WHERE Sangat Lambat dalam MySQL?. 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