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

相关推荐
五步晦暝1 小时前
【Excel 支持正则的方法】解决VBA引入正则的方法和步骤
数据库·mysql·excel
卡戎-caryon1 小时前
【MySQL】07.表内容的操作
linux·网络·数据库·mysql·存储引擎
一只fish2 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(11)
数据库·mysql
麓殇⊙2 小时前
黑马点评--基于Redis实现共享session登录
数据库·redis·firefox
zhutoutoutousan2 小时前
解决 Supabase “permission denied for table XXX“ 错误
javascript·数据库·oracle·个人开发
泽韦德2 小时前
【MySQL】第8节|Innodb底层原理与Mysql日志机制深入剖析(一)
数据库·mysql
vvilkim2 小时前
MongoDB 数据库迁移:完整指南与最佳实践
数据库·mongodb
vvilkim2 小时前
MongoDB索引:原理、实践与优化指南
数据库·mongodb
卑微的Coder2 小时前
Redis 常用命令
数据库·redis·缓存
怡雪~4 小时前
redis配置带验证的主从复制
数据库·redis