MySQL in和exists的取舍

in和exists的取舍

之前说过要小表驱动大表,即先遍历小表再遍历大表,接下来看一下in和exists的区别

in

先执行子查询,适合于外表大而内表小的情况

sql 复制代码
select * from A where id in (select id from B)

等价于==
先遍历表B select id from B
再遍历表A select * from A where A.id = B.id

in的参数是子查询时,会将子查询结果存储在一张临时的表中(内联视图),然后扫描整个视图

exists

以外层表作为驱动表,外层表先被访问,适合于外表大而内表小的情况

sql 复制代码
select * from A where id exists (select 1 from A.id = B.id)

等价于
先遍历表A  select * from A
再遍历表B  select * from B where A.id = B.id

将主查询数据放到子查询中做验证,根据验证结果来确定主查询结果的去留

使用exists数据库不会生成临时的表

结论

根据执行顺序也就得知了什么时候该用in什么时候该用exists了

子查询数据量大的时候用exists

zhhll.icu/2021/数据库/关系...

本文由mdnice多平台发布

相关推荐
成为大佬先秃头3 小时前
数据库连接池:Druid
数据库·mysql·druid
晓华-warm6 小时前
Warm-Flow 1.8.5 正式发布:超时自动审批、暂存功能来了!
数据库
u0136863827 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
light blue bird7 小时前
多页签Razor组支轴业务整顿组件
数据库·.net·ai大数据·多功能图表报表·web mvc + razor
wregjru7 小时前
【mysql】2.数据表操作
数据库·mysql
手握风云-7 小时前
基于 Java 的网页聊天室(三)
服务器·前端·数据库
LcVong7 小时前
MySQL 5.2/5.7 开启Binlog日志详细步骤(附验证+查看+恢复)
数据库·mysql·adb
FL4m3Y4n8 小时前
MySQL缓存策略
数据库·mysql·缓存
wsx_iot8 小时前
TDengine学习
数据库·学习·tdengine
不吃香菜的小趴菜8 小时前
mysql数据库打包与导入
数据库·mysql