Rumah > pangkalan data > tutorial mysql > EXISTS lwn. IN Subqueries: Bagaimanakah Saya Boleh Mengoptimumkan Prestasi Pertanyaan SQL Saya?

EXISTS lwn. IN Subqueries: Bagaimanakah Saya Boleh Mengoptimumkan Prestasi Pertanyaan SQL Saya?

Patricia Arquette
Lepaskan: 2025-01-03 01:23:39
asal
526 orang telah melayarinya

EXISTS vs. IN Subqueries: How Can I Optimize My SQL Query Performance?

Subkueri dengan EXISTS vs IN: Pengoptimuman Prestasi

Apabila bekerja dengan subkueri, pengoptimuman prestasi adalah penting. Dua kaedah subquery biasa ialah EXISTS dan IN, masing-masing mempunyai kelebihan dan kelemahan tersendiri. Dalam siaran ini, kami akan meneroka perbezaan utama antara kaedah ini dan menunjukkan kesan prestasinya.

Pernyataan Masalah

Dua subkueri berikut adalah semantik, tetapi Kaedah 1 mengambil masa yang lebih lama untuk dilaksanakan daripada Kaedah 2:

Kaedah 1 (Menggunakan DALAM)

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 (Menggunakan EXISTS)

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

Perbezaan Prestasi

Oleh menganalisis Rancangan Terangkan, kita boleh memahami mengapa Kaedah 2 lebih pantas. Perbezaan utama terletak pada cara kaedah ini mengendalikan subkueri:

  • DALAM: Subkueri dinilai beberapa kali, sekali untuk setiap baris dalam pertanyaan luar. Ini kerana IN melakukan imbasan jadual penuh pada jadual subkueri untuk setiap perbandingan baris.
  • WUJUD: Subkueri dinilai sekali sahaja, tanpa mengira bilangan baris dalam pertanyaan luar. Ini kerana EXISTS serta-merta mengembalikan benar atau salah sebaik sahaja baris yang sepadan ditemui.

Kelebihan EXISTS

Menggunakan EXISTS menawarkan beberapa kelebihan berbanding IN, terutamanya apabila berurusan dengan hasil subkueri yang besar:

  • Lebih pantas Pelaksanaan: EXISTS boleh menjadi jauh lebih pantas, kerana ia mengelakkan imbasan jadual yang tidak perlu.
  • Kesederhanaan: EXISTS secara amnya lebih mudah dibaca dan difahami daripada IN, terutamanya untuk subkueri yang kompleks.
  • Pengendalian NULL: EXISTS boleh mengendalikan NULL nilai lebih baik daripada IN, sebagai hasil NULL daripada subkueri hanya dinilai palsu.

Kelebihan IN

Walaupun EXISTS pada umumnya lebih berprestasi, IN mungkin diutamakan dalam senario tertentu:

  • Small Subquery Keputusan: Apabila set hasil subkueri adalah kecil, overhed prestasi IN menjadi diabaikan berbanding EXISTS.
  • Keperluan Khusus: Dalam beberapa kes yang jarang berlaku, semantik IN mungkin diperlukan untuk memenuhi perniagaan tertentu keperluan.

Kesimpulan

Dalam kebanyakan kes, EXISTS ialah kaedah pilihan untuk subkueri kerana kelebihan prestasinya dan pengendalian nilai NULL. Walau bagaimanapun, adalah penting untuk mempertimbangkan kes penggunaan dan saiz subkueri tertentu apabila memilih antara EXISTS dan IN untuk mengoptimumkan prestasi dan kecekapan pertanyaan.

Atas ialah kandungan terperinci EXISTS lwn. IN Subqueries: Bagaimanakah Saya Boleh Mengoptimumkan Prestasi Pertanyaan SQL Saya?. 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