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

相关推荐
mN9B2uk17几秒前
SQL Server 数据库设计
数据库·oracle
Elastic 中国社区官方博客3 分钟前
使用 Jina CLIP v2 和 Elasticsearch 实现多语言图片搜索
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·jina
闪电悠米7 分钟前
黑马点评-分布式锁-02_simple_redis_lock_setnx
java·数据库·spring boot·redis·分布式·缓存·wpf
数据库小学妹8 分钟前
数据库高可用架构实战:从主从复制到两地三中心的四层演进与避坑
数据库·经验分享·架构·dba
Gong-Yu13 分钟前
MySQL数据库运维(1)
运维·数据库·mysql·慢查询
柏舟飞流16 分钟前
StarRocks: 新一代极速全场景MPP数据库
数据库
Database_Cool_23 分钟前
阿里云 AnalyticDB MySQL 免运维实践:分析型数据库不需要专人运维
数据库·数据仓库·mysql·阿里云
小镇敲码人25 分钟前
MySQL事务介绍
android·数据库·mysql·adb
AIMath~27 分钟前
MongoDB数据库,MySQL数据库,Redis数据库,Milvus数据库对比分析与和核心总结
数据库·mysql·mongodb·milvus
憧憬成为java架构高手的小白33 分钟前
mysql(ai总结每章的知识)
数据库·mysql·oracle