首頁 > 資料庫 > mysql教程 > MySQL 子查詢:何時應使用 EXISTS 與 IN 以獲得最佳效能?

MySQL 子查詢:何時應使用 EXISTS 與 IN 以獲得最佳效能?

DDD
發布: 2025-01-04 06:12:40
原創
185 人瀏覽過

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

MySQL 中使用EXISTS 與IN 的子查詢:效能最佳化

在MySQL 中使用子查詢時,有兩種常見的方法:使用IN運算子並使用EXISTS 運算子。雖然這兩種方法可以實現相似的結果,但它們在性能上可能表現出顯著差異。

考慮以下兩個子查詢範例:

方法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 
         )
   )
登入後複製

方法2 (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
         )                                             
   )
登入後複製

如問題陳述所述,方法 1的執行時間明顯長於方法 2。這是由於兩種方法處理子查詢的方式有根本差異。

IN 運算子:

使用 IN 運算子時,MySQL 執行子查詢多次,主查詢中的每一行一次。在這種情況下,對於追蹤器表中的每一行,都會執行子查詢來確定它是否符合指定的條件。這可能會導致顯著的效能開銷,特別是在子查詢複雜或包含大量資料的情況下。

EXISTS 運算子:

相反,EXISTS 運算子查詢只執行一次。它檢查子查詢結果中是否至少有一個與主查詢中的目前行相符的行。如果存在匹配,則 EXISTS 條件被評估為 true;否則,它是錯誤的。這種方法效率更高,因為它避免了多次從子查詢中檢索所有行的需要。

在IN 和EXISTS 之間進行選擇:

通常,它是建議盡可能使用EXISTS 運算符,因為它在大多數情況下提供更好的性能。以下是一些指導原則,可幫助您做出正確的選擇:

  • 當您需要檢查是否存在符合特定條件的行時,請使用 EXISTS。
  • 當您需要時,請使用 IN來擷取符合某個條件的所有行。
  • 如果子查詢結果很大,EXISTS 會優於IN。
  • 如果子查詢結果非常小,IN 可能會優於 EXISTS。

其他注意事項:

  • 空值使用 IN 運算子時可能會遇到問題。如果子查詢傳回 Null,則整個 IN 條件將計算為 Null,可能會影響主查詢的結果。
  • EXISTS 用途更廣泛,可以處理子查詢傳回多行或包含聚合函數的情況。

以上是MySQL 子查詢:何時應使用 EXISTS 與 IN 以獲得最佳效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板