使用MySql查詢數據時,一直搞不清楚in和exists兩者到底有什麼區别,今天總算搞清楚了。
大概規則如下:
當B表的數據集小于A表數據集時,用in優于exists。
select id from A where id in (select id from B)
當A表的數據集小于B表的數據集時,用exists優于in。
select id from A where id in(select id from B);
可以這麼理解:in後面跟的是小表,exists後面跟的是大表
select * from A where id in (select id from B)
也可以寫成
select id from B b
left join
select id from A a where a.id = b.id
小表驅動大表
為什麼會這樣呢,這裡我們需要了解MySql的小表驅動大表。
我們在編寫程序時,時常遇到循環嵌套的,最常見的莫過于兩個for嵌套
例如
for(int i=0;i<10;i ){
for(int j=0;j<1000;j ){
}
}
如果小的循環在外層,對于數據庫連接來說就隻連接10次,進行10000次操作。
如果1000在外,則需要進行1000次數據庫連接,這樣就相當浪費資源了。
MySql的join實現原理,以驅動表的數據為基礎,“嵌套循環”去被驅動表匹配記錄,例如:
select * from a join b on a.id =b.id
假設 a表1000000數據,b表100數據,這裡有兩個過程,b 表數據最少,查詢引擎優化選擇b為驅動表,循環b表的100條數據,跟a表的1000000數據去匹配,這個匹配的過程是B 樹的查找過程,比循環取數要快的多。
需要注意的是a表字段id和b表字段id 都要建立索引。
總結:
小表驅動大表,in後面跟的是小表,exists後面跟的是大表。
由于筆者知識及水平有限,文中錯漏之處在所難免,如有不足之處,歡迎交流。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!