實習工作中Sql 語句中 IN 和 EXISTS 的心得體會
在學校時做專案時資料庫表少而且資料量也不大,做子查詢的時候一般沒有什麼區別,所以一直以來沒有注意過這個問題。
如今工作後,讓我實現政府執法人員執政編號的修改,用IN做子查詢時發現效率特別慢,最後發現是因為IN語句中查詢順序不同導致的。
IN 語句:只執行一次
確定給定的值是否與子查詢或列表中的值相匹配。IN在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾積,然後按照條件進行篩選。所以相對內表比較小的時候,IN的速度較快。
尤其是當我用市級證件表與市級制證表關聯的時候,子查詢中市級制證表中資料龐大 ,查詢效率低,這時我想到還有EXISTS語句
之前對它兩的區別不是特別清楚,經過查詢後得出這正是我現在需要的。
EXISTS語句:執行外表.length次
指定一個子查詢,檢測行的存在。遍歷迴圈外表,然後看外表中的記錄有沒有和內表的資料一樣的。匹配上就將結果放入結果集中。
實習工作中遇到一些問題,不僅鞏固了我之前知識的不足,而且為以後遇到各種各樣的問題提供了經驗。
以下是轉載內容:
區別及應用場景
in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外IN時不對NULL進行處理。
in 是把外表和內表作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。
not in 和not exists
如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
---------------------
作者:wqc19920906
來源:CSDN
原文:https://blog.csdn.net/wqc19920906/article/details/79800374
版權宣告:本文為博主原創文章,轉載請附上博文連結!