JOIN、IN、EXISTS效率

 
EXISTS、IN與JOIN,都可以用來實現形如“查詢A表中在(或不在)B表中的記錄”的查詢邏輯。

在查詢的兩個表大小相當的情況下,3種查詢方式的執行時間通常是:
EXISTS <= IN <= JOIN
NOT EXISTS <= NOT IN <= LEFT JOIN
只有當表中字段允許NULL時,NOT IN的方式最慢:
NOT EXISTS <= LEFT JOIN <= NOT IN

但是如果兩個表中一個較小,一個較大,則子查詢表大的用exists,子查詢表小的用in,因爲in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。而無論那個表大,用not exists都比not in要快。這是因爲如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。

IN的好處是邏輯直觀簡單(通常是獨立子查詢);缺點是隻能判斷單字段,並且當NOT IN時效率較低,而且NULL會導致不想要的結果。
EXISTS的好處是效率高,可以判斷單字段和組合字段,並不受NULL的影響;缺點是邏輯稍微複雜(通常是相關子查詢)。
JOIN用在這種場合,往往是喫力不討好。JOIN的用途是聯接兩個表,而不是判斷一個表的記錄是否在另一個表。

------------------------------------------------------------------------

如果要查詢每個類別的最大sid 的話

select * from test a 
  
where not exists(select 1 from test where sort = a.sort and sid > a.sid) 

select * from test a 
  
where sid in (select max(sid) from test where sort = a.sort) 

的執行效率要高三倍以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章