首頁 >資料庫 >mysql教程 >MySQL 子查詢中的 EXISTS 與 IN:哪個效能比較好?

MySQL 子查詢中的 EXISTS 與 IN:哪個效能比較好?

Patricia Arquette
Patricia Arquette原創
2025-01-03 08:44:39878瀏覽

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

MySQL 中EXISTS 與IN 的子查詢:效能比較

子查詢在從資料庫中提取特定資料方面發揮著至關重要的作用。兩種常見的子查詢方法是 EXISTS 和 IN。雖然兩者都可以實現相似的結果,但它們表現出不同的性能特徵。

考慮以下兩個查詢:

方法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
        )
);

方法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
        )
);

方法2:

方法2:

  • 方法2:
  • >從效能角度來看,方法2 明顯優於方法1,執行時間不到 1秒,而執行時間超過 10 秒。要理解這種差異的原因,我們必須深入研究每種方法的內部工作原理。
EXISTS 與 IN:主要差異

    EXISTS :
  • 檢查是否至少有一行與子查詢相符。如果是,則傳回true;否則,傳回 false。它依賴行的存在,而不是檢索行本身。
  • IN:
  • 將外部查詢中的值與子查詢中的每行進行比較。如果找到匹配,則傳回 true;否則,傳回 false。它針對子查詢中的所有行執行。
  • 效能注意事項

子查詢大小:當子查詢傳回較大值時行數,IN 與所有行相比可能會變得昂貴。相反,EXISTS 只需要找到一個匹配行,這對於大型子查詢來說更有效率。

空值:

EXISTS 可以比 IN 更有效率地處理空值。當帶有 IN 的子查詢傳回 null 時,它可以將 null 傳播到外部查詢。但是,EXISTS 將 null 視為 false。 最佳化: MySQL 可以使用索引來最佳化 EXISTS,而 IN 可能需要額外的最佳化,例如使用物化或物化視圖。 結論一般來說,EXISTS是當子查詢預計傳回大量行或涉及空值時建議使用。對於小型子查詢,IN 可以提高效能。始終建議使用解釋計劃來確定特定查詢的最佳方法。

以上是MySQL 子查詢中的 EXISTS 與 IN:哪個效能比較好?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn