tft每日頭條

 > 生活

 > exist快還是innerjoin快

exist快還是innerjoin快

生活 更新时间:2025-01-08 11:23:01

使用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 ){ } }

exist快還是innerjoin快(一直搞不清楚in和exists兩者到底有什麼區别)1

如果小的循環在外層,對于數據庫連接來說就隻連接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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved