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多平台发布

相关推荐
m0_613856293 小时前
Golang怎么实现测试跳过条件_Golang如何根据环境或条件跳过不适用的测试用例【操作】
jvm·数据库·python
csdn2015_3 小时前
修改分类信息的时候将分类异步写入redis
数据库·redis·bootstrap
STAT abil3 小时前
MySQL 的mysql_secure_installation安全脚本执行过程介绍
数据库·mysql·安全
SelectDB4 小时前
从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台
大数据·数据库·数据分析
abc123456sdggfd4 小时前
bootstrap如何修改输入框获取焦点时的光晕
jvm·数据库·python
woniu_buhui_fei4 小时前
Redis知识整理二
数据库·redis·缓存
qq_330037994 小时前
如何配置ASM元数据备份_md_backup与md_restore重建磁盘组结构
jvm·数据库·python
untE EADO4 小时前
redis的下载和安装详解
数据库·redis·缓存
a9511416424 小时前
SQL触发器实现自动生成流水号_配合序列对象实现递增逻辑
jvm·数据库·python
BduL OWED4 小时前
SQL进阶——JOIN操作详解
数据库·sql·oracle