MySQL中exists和in的區別及使用場景

exists和in的使用方式:  


#對B查詢涉及id,使用索引,故B表效率高,可用大表 -->外小內大 
select * from A where exists (select * from B where A.id=B.id);
#對A查詢涉及id,使用索引,故A表效率高,可用大表 -->外大內小
select * from A where A.id in (select id from B);

 1、exists是對外表做loop循環,每次loop循環再對內表(子查詢)進行查詢,那麼因爲對內表的查詢使用的索引(內表效率高,故可用大表),而外表有多大都需要遍歷,不可避免(儘量用小表),故內表大的使用exists,可加快效率;

  2、in是把外表和內表做hash連接,先查詢內表,再把內表結果與外表匹配,對外表使用索引(外表效率高,可用大表),而內表多大都需要查詢,不可避免,故外表大的使用in,可加快效率。

  3、如果用not in ,則是內外表都全表掃描,無索引,效率低,可考慮使用not exists,也可使用A left join B on A.id=B.id where B.id is null 進行優化。

  此外,新近遇到的坑,mysql版本問題:

  MySQL版本問題:5.6.5優化了子查詢,引入物化子查詢(針對where clause的subquery),子查詢物化將子查詢結果存入臨時表,確保子查詢只執行一次,該表不記錄重複數據且採用哈希索引查找;

而之前的版本則會把非相關子查詢轉化爲相關子查詢,導致效率低下(尤其是子查詢是小表,外表是大表的情況下,效率變慢許多)。  

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