Rumah > pangkalan data > tutorial mysql > Subqueries MySQL: Bilakah Saya Perlu Menggunakan EXISTS vs. IN untuk Prestasi Optimum?

Subqueries MySQL: Bilakah Saya Perlu Menggunakan EXISTS vs. IN untuk Prestasi Optimum?

DDD
Lepaskan: 2025-01-04 06:12:40
asal
185 orang telah melayarinya

MySQL Subqueries: When Should I Use EXISTS vs. IN for Optimal Performance?

Subqueries dengan EXISTS vs IN dalam MySQL: Pengoptimuman Prestasi

Apabila bekerja dengan subqueries dalam MySQL, terdapat dua pendekatan biasa: menggunakan IN operator dan menggunakan operator EXISTS. Walaupun kedua-dua kaedah boleh mencapai hasil yang serupa, ia boleh menunjukkan perbezaan yang ketara dalam prestasi.

Pertimbangkan dua contoh subkueri berikut:

Kaedah 1 (IN):

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 
         )
   )
Salin selepas log masuk

Kaedah 2 (WUJUD):

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
         )                                             
   )
Salin selepas log masuk

Seperti yang dinyatakan dalam pernyataan masalah, Kaedah 1 mengambil masa yang lebih lama untuk dilaksanakan berbanding Kaedah 2. Ini disebabkan perbezaan asas dalam cara kedua-dua pendekatan mengendalikan subkueri.

IN Operator:

Apabila menggunakan operator IN, MySQL melaksanakan subquery beberapa kali, sekali untuk setiap baris dalam pertanyaan utama. Dalam kes ini, bagi setiap baris dalam jadual penjejak, subquery dilaksanakan untuk menentukan sama ada ia memenuhi kriteria yang ditentukan. Ini boleh membawa kepada overhed prestasi yang ketara, terutamanya jika subkueri adalah kompleks atau mengandungi sejumlah besar data.

WUJUD Operator:

Sebaliknya, pengendali EXISTS melaksanakan subkueri sekali sahaja. Ia menyemak sama ada terdapat sekurang-kurangnya satu baris yang sepadan dalam hasil subkueri untuk baris semasa dalam pertanyaan utama. Jika terdapat padanan, keadaan EXISTS dinilai sebagai benar; jika tidak, ia adalah palsu. Pendekatan ini adalah lebih cekap kerana ia mengelakkan keperluan untuk mendapatkan semula semua baris daripada subkueri beberapa kali.

Memilih Antara IN dan WUJUD:

Secara amnya, ia adalah disyorkan untuk menggunakan operator EXISTS apabila boleh, kerana ia memberikan prestasi yang lebih baik dalam kebanyakan kes. Berikut ialah beberapa garis panduan untuk membantu anda membuat pilihan yang tepat:

  • Gunakan EXISTS apabila anda perlu menyemak sama ada baris wujud yang sepadan dengan kriteria tertentu.
  • Gunakan IN apabila anda perlu dapatkan semula semua baris yang sepadan dengan kriteria tertentu.
  • Jika hasil subkueri sangat besar, EXISTS akan mengatasi prestasi IN.
  • Jika hasil subkueri sangat kecil, IN mungkin mengatasi prestasi WUJUD.

Pertimbangan Tambahan:

  • Nilai nol boleh menjadi gotcha apabila menggunakan operator IN. Jika subquery mengembalikan Null, keseluruhan keadaan IN akan dinilai kepada Null, yang berpotensi menjejaskan hasil pertanyaan utama.
  • EXISTS lebih serba boleh dan boleh mengendalikan kes di mana subquery mengembalikan berbilang baris atau mengandungi fungsi agregat.

Atas ialah kandungan terperinci Subqueries MySQL: Bilakah Saya Perlu Menggunakan EXISTS vs. IN untuk Prestasi Optimum?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan