在sql語句多表連接中,in、exists、join那個效率更高一點
EXISTS、IN與JOIN,都可以用來實現形如“查詢A表中在(或不在)B表中的記錄”的查詢邏輯。
在查詢的兩個表大小相當的情況下,3種查詢方式的執行時間通常是:
EXISTS NOT EXISTS 只有當表中字段允許NULL時,NOT IN的方式最慢:
NOT EXISTS
但是如果兩個表中一個較小,一個較大,則子查詢表大的用exists,子查詢表小的用in,因為in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。而無論那個表大,用not exists都比not in要快。這是因為如果查詢語句使用了not in 那么內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
IN的好處是邏輯直觀簡單(通常是獨立子查詢);缺點是只能判斷單字段,并且當NOT IN時效率較低,而且NULL會導致不想要的結果。
EXISTS的好處是效率高,可以判斷單字段和組合字段,并不受NULL的影響;缺點是邏輯稍微復雜(通常是相關子查詢)。
JOIN用在這種場合,往往是吃力不討好。JOIN的用途是聯接兩個表,而不是判斷一個表的記錄是否在另一個表。
但據說in效率也不如exist,,, 以上語句可以改成exist的嗎, 或者其
個人看法,在大規模數據庫中,關鍵是明白每個關鍵字在表中使用的時候,具體的實現邏輯,也就是對表的操作邏輯。就你上次舉例的語句,如果數據有5百萬以上,非聚合索引列,那么,實際消耗最大的還是遍歷表,至于對每個記錄的對比,in 還是exist 還是多個or,其實差別及其細微,而且和外部環境/列屬性都有關系,不能一概而論。
如果你是簡單了解,那么記得,exist不要隨便用(一般管理子查詢),in=多個or,就可以了。
如果是研究,那么。。我沒資格教你,也就是互相探討。研究的話,還是認真看一些英文原版的資料吧,這里探討。。終覺淺(個人看法)