1. 程式人生 > >面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進行全表查詢,exists不會全表查詢,然後,我就灰溜溜的回來了!

今天就來徹底搞清楚它們的區別,查詢了眾多網上資料如下:

轉: Mysql中 in or exists not exists not in區別 (網路整理)

轉: Sql語句中IN和exists的區別及應用

總結起來大概是這樣的:

in是先進行子查詢,然後將內表(子查詢)與外表(主查詢)進行hash關聯(笛卡爾積),然後進行條件比較,即篩選in前後欄位相等的資料保留,不相等的刪除.

exists是先進行外層表loop迴圈,然後將每一條資料當做條件進行子查詢,如果子查詢返回true則儲存該資料,否則刪除.

可以理解為用in時先子表全表查詢,然後將每一條資料作為條件以及索引拿去進行主表查詢,所以如果主表大於子表,那麼用in就會效率高,

而用exists會先進行主表全表查詢,然後將每一條資料作為條件以及索引拿去進行子表查詢,,所以如果主表小於子表,那麼用exists會效率高.

因為索引在資料多的時候才真正派上用場了.

 

not in主表和子表都不會用到索引且子表有null值時,查詢結果有問題,

而not exists子表始終會用到索引,而且不會存在子表有null值時的問題

轉: [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

所以,用not exists替代not in