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:
子查詢大小:當子查詢傳回較大值時行數,IN 與所有行相比可能會變得昂貴。相反,EXISTS 只需要找到一個匹配行,這對於大型子查詢來說更有效率。
空值:
EXISTS 可以比 IN 更有效率地處理空值。當帶有 IN 的子查詢傳回 null 時,它可以將 null 傳播到外部查詢。但是,EXISTS 將 null 視為 false。 最佳化: MySQL 可以使用索引來最佳化 EXISTS,而 IN 可能需要額外的最佳化,例如使用物化或物化視圖。 結論一般來說,EXISTS是當子查詢預計傳回大量行或涉及空值時建議使用。對於小型子查詢,IN 可以提高效能。始終建議使用解釋計劃來確定特定查詢的最佳方法。以上是MySQL 子查詢中的 EXISTS 與 IN:哪個效能比較好?的詳細內容。更多資訊請關注PHP中文網其他相關文章!