Rumah >pangkalan data >tutorial mysql >EXISTS lwn. IN dalam Subkueri MySQL: Yang Berprestasi Lebih Baik?

EXISTS lwn. IN dalam Subkueri MySQL: Yang Berprestasi Lebih Baik?

Patricia Arquette
Patricia Arquetteasal
2025-01-03 08:44:39907semak imbas

EXISTS vs. IN in MySQL Subqueries: Which Performs Better?

Subqueries dengan EXISTS vs IN dalam MySQL: Perbandingan Prestasi

Subqueries memainkan peranan penting dalam mengekstrak data tertentu daripada pangkalan data. Dua kaedah subquery biasa ialah EXISTS dan IN. Walaupun kedua-duanya boleh mencapai hasil yang serupa, mereka mempamerkan ciri prestasi yang berbeza.

Pertimbangkan dua pertanyaan berikut:

Kaedah 1:

SELECT *
FROM tracker
WHERE reservation_id IN (
    SELECT reservation_id
    FROM tracker
    GROUP BY reservation_id
    HAVING
        (
            method = 1
            AND type = 0
            AND Count(*) > 1
        )
        OR (
            method = 1
            AND type = 1
            AND Count(*) > 1
        )
        OR (
            method = 2
            AND type = 2
            AND Count(*) > 0
        )
        OR (
            method = 3
            AND type = 0
            AND Count(*) > 0
        )
        OR (
            method = 3
            AND type = 1
            AND Count(*) > 1
        )
        OR (
            method = 3
            AND type = 3
            AND Count(*) > 0
        )
);

Kaedah 2:

SELECT *
FROM tracker t
WHERE EXISTS (
    SELECT reservation_id
    FROM tracker t3
    WHERE
        t3.reservation_id = t.reservation_id
    GROUP BY reservation_id
    HAVING
        (
            METHOD = 1
            AND TYPE = 0
            AND COUNT(*) > 1
        )
        OR (
            METHOD = 1
            AND TYPE = 1
            AND COUNT(*) > 1
        )
        OR (
            METHOD = 2
            AND TYPE = 2
            AND COUNT(*) > 0
        )
        OR (
            METHOD = 3
            AND TYPE = 0
            AND COUNT(*) > 0
        )
        OR (
            METHOD = 3
            AND TYPE = 1
            AND COUNT(*) > 1
        )
        OR (
            METHOD = 3
            AND TYPE = 3
            AND COUNT(*) > 0
        )
);

Dari segi prestasi, Kaedah 2 dengan ketara mengatasi Kaedah 1, mengambil masa di bawah 1 saat untuk dilaksanakan berbanding lebih 10 saat. Untuk memahami sebab percanggahan ini, kita mesti menyelidiki cara dalaman setiap kaedah.

WUJUD vs DALAM: Perbezaan Utama

  • WUJUD : Menyemak sama ada sekurang-kurangnya satu baris sepadan dengan subkueri. Jika ya, ia kembali benar; jika tidak, ia kembali palsu. Ia bergantung pada kewujudan baris dan bukannya mendapatkan semula baris itu sendiri.
  • DALAM: Membandingkan nilai daripada pertanyaan luar kepada setiap baris dalam subkueri. Jika padanan ditemui, ia kembali benar; jika tidak, ia kembali palsu. Ia dilaksanakan terhadap semua baris dalam subkueri.

Pertimbangan Prestasi

  • Saiz Subkueri: Apabila subkueri mengembalikan saiz besar bilangan baris, IN boleh menjadi mahal kerana ia dibandingkan dengan kesemuanya. Sebaliknya, EXISTS hanya perlu mencari satu baris yang sepadan, menjadikannya lebih cekap untuk subkueri besar.
  • Nilai Null: EXISTS boleh mengendalikan nilai nol dengan lebih cekap daripada IN. Apabila subkueri dengan IN mengembalikan null, ia boleh menyebarkan null ke pertanyaan luar. Walau bagaimanapun, EXISTS menganggap null sebagai palsu.
  • Pengoptimuman: MySQL boleh mengoptimumkan EXISTS menggunakan indeks, manakala IN mungkin memerlukan pengoptimuman tambahan, seperti menggunakan materialisasi atau paparan terwujud.

Kesimpulan

Secara amnya, WUJUD disyorkan apabila subkueri dijangka mengembalikan sejumlah besar baris atau jika nilai nol terlibat. Untuk subkueri kecil, IN boleh menjadi lebih berprestasi. Anda sentiasa dinasihatkan untuk menggunakan Explain Plan untuk menentukan pendekatan terbaik untuk pertanyaan tertentu.

Atas ialah kandungan terperinci EXISTS lwn. IN dalam Subkueri MySQL: Yang Berprestasi Lebih Baik?. 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