100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 一直搞不清楚in和exists两者到底有什么区别 今天总算搞清楚了

一直搞不清楚in和exists两者到底有什么区别 今天总算搞清楚了

时间:2022-03-21 21:23:52

相关推荐

一直搞不清楚in和exists两者到底有什么区别 今天总算搞清楚了

使用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 bleft joinselect 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后面跟的是大表。

由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,欢迎交流。

-END-

往期推荐:

不清楚MySQL索引为什么会失效,面试官:回去等通知

生成服务器服务变慢了,如何排查思路?

mysql自增长id用完了,怎么办?

微信公众号:爱开发

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。