网站首页 > 技术文章 正文
使用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后面跟的是大表。
由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,欢迎交流。
猜你喜欢
- 2024-10-17 Senior CPC, CPV officials hold talks in Beijing
- 2024-10-17 戴尔U2417H显示器开箱体验:不愧是完美屏,超窄边框太惊艳!
- 2024-10-17 微软 Win11/10 Linux 子系统 WSL 现已支持 systemd
- 2024-10-17 Lammps 初学者——in 文件中文解析
- 2024-10-17 虚伪的职场社交:领英变得越来越没意义了
- 2024-10-17 in ,with ,by 用法精讲(in,by,with,on的用法)
- 2024-10-17 表示时间介词汇总(1)(表示时间的介词短语)
- 2024-10-17 如何禁用Microsoft Edge的InPrivate功能
- 2024-10-17 IND 申报简单介绍#临床医学(ind临床研究申请)
- 2024-10-17 DIN 1.4021 不锈钢 X20Cr13 材料特性
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)