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 分钟前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
吱吱鼠叔34 分钟前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab
小哇66636 分钟前
spring-TransactionTemplate 编程式事务
数据库·spring
如意机反光镜裸1 小时前
CentOS7安装MySQL教程
数据库·mysql
冰镇毛衣1 小时前
1.4 MySql配置文件
数据库·mysql
攻城狮的梦1 小时前
redis集群模式连接
数据库·redis·缓存
标贝科技2 小时前
ChatGPT对话训练数据采集渠道有哪些
数据库·人工智能·机器学习·chatgpt
乌啼霜满天2492 小时前
如何将MySQL卸载干净(win11)
数据库·mysql
2的n次方_2 小时前
掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制
数据库·spring boot·hibernate
NaZiMeKiY3 小时前
SQLServer数据分页
数据库·sql·sqlserver