MYSQL中IN與EXISTS的區別

在MYSQL的連表查詢中,最好是遵循‘小表驅動大表的原則’數據庫

1、IN與EXISTS的區別
一、IN查詢分析
SELECT   *  FROM A WHERE id IN (SELECT id FROM B);緩存

等價於:一、SELECT id FROM B ----->先執行in中的查詢性能

              二、SELECT *  FROM A  WHERE A.id = B.id.net

以上in()中的查詢只執行一次,它查詢出B中的全部的id並緩存起來,而後檢查A表中查詢出的id在緩存中是否存在,若是存在則將A的查詢數據加入到結果集中,直到遍歷完A表中全部的結果集爲止。blog

如下用遍歷結果集的方式來分析IN查詢內存

 

經過以上程序能夠看出,當B表的數據較大時不適合使用in()查詢,由於它會將B表中的數據所有遍歷一次get

例如:table

一、A表中有100條記錄,B表中有1000條記錄,那麼最多可能遍歷100*1000次,效率不好效率

二、A表中有1000條記錄,B表中有100條記錄,那麼最多可遍歷1000*100此,內循環次數減小,效率大大提高循環

結論:IN()查詢適合B表數據比A表數據小的狀況,IN()查詢是從緩存中取數據

二、EXISTS查詢分析
語法:SELECT  字段 FROM  table WHERE EXISTS(subquery);

SELECT * FROM a WHERE EXISTS(SELECT 1 FROM b WHERE B.id  = A.id);

以上查詢等價於:

一、SELECT * FROM A;

二、SELECT I FROM B WHERE B.id = A.id;

EXISTS()查詢會執行SELECT * FROM A查詢,執行A.length次,並不會將EXISTS()查詢結果結果進行緩存,由於EXISTS()查詢返回一個布爾值true或flase,它只在意EXISTS()的查詢中是否有記錄,與具體的結果集無關。

EXISTS()查詢是將主查詢的結果集放到子查詢中作驗證,根據驗證結果是true或false來決定主查詢數據結果是否得以保存。

如下用遍歷結果集的方式來分析EXISTS查詢

 

從以上程序能夠看出:

當B表的數據比A表的數據大時適合使用EXISTS()查詢,由於它不用遍歷B操做,只執行一次查詢就OK了

例如:

一、A表有100條記錄,B表有1000條記錄,那麼EXISTS()會執行100次去判斷A表中的id是否與B表中的id相等.由於它只執行A.length次,可見B表數據越多,越適合EXISTS()發揮效果.

二、A表有10000條記錄,B表有100條記錄,那麼EXISTS()仍是執行10000次,此時不如使用in()遍歷10000*100次,由於IN()是在內存裏遍歷數據進行比較,而EXISTS()須要查詢數據庫,咱們都知道查詢數據庫所消耗的性能更高,而內存比較很快.

三、結論:exists()適合B表比A表數據大的狀況,當A表數據與B表數據同樣大時,in與exists效率差很少,可任選一個使用

---------------------
原文:http://www.javashuo.com/article/p-yikdktup-hs.html

相關文章
相關標籤/搜索