SQL優化之IN與exists

  • IN含義?
    • 確定給定的值是否與子查詢或列表中的值相匹配,IN時不對NULL進行處理。
  • IN如何查詢?
    • in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾積,然後按照條件進行篩選。所以相對內表比較小的時候,in的速度較快。
    • 笛卡爾積是什麼?
      • 類似的例子如:如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。A表示所有聲母的集合,B表示所有韻母的集合,那麼A和B的笛卡爾積就爲所有可能的漢字全拼。
  • 何時用IN?
    • IN後條件不多,可以考慮主表建索引,或用union all 代替。
    • 如果in後接幾百幾千或幾萬的條件,可把in裏的條件錄入臨時表,給臨時表加索引,用表連接代替。
    • a表【表示主表】的數據大於b表【表示子查詢表】的數據(關聯查詢後的數據)。
  • exists含義?
    • 在一個查詢SQL中使用EXISTS關鍵子時表示改結果是否存在,如果存在則返回數據,反之返回false。
  • in 和 exists的區別:
    • 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是性能變化的關鍵),如果是exists,那麼以外層表爲驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回爲目標,那麼就會考慮到索引及結果集的關係了 ,另外IN時不對NULL進行處理。
  • 何時用EXISTS?
    • a表【表示主表】的數據小於b表【表示子查詢表】的數據(關聯查詢後的數據)。
  • 如何解決了您的問題,歡迎關注我!還希望來JAVA WEB開發交流羣:958923746,有問題歡迎共享,共同提升!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章