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

相关推荐
无敌最俊朗@17 小时前
SQLite 核心知识点讲解
jvm·数据库·oracle
小宋102117 小时前
Neo4j-图数据库入门图文保姆攻略
数据库·neo4j
lang2015092818 小时前
Spring数据库连接控制全解析
java·数据库·spring
十八岁讨厌编程18 小时前
【后端SQL训练营】高频 SQL 50 题(基础版·上篇)
数据库·sql
迷失的walker18 小时前
【Qt C++ QSerialPort】QSerialPort fQSerialPortInfo::availablePorts() 执行报错问题解决方案
数据库·c++·qt
程序新视界18 小时前
什么是OLTP ,MySQL是如何支持OLTP的?
数据库·后端·mysql
pen-ai19 小时前
【数据工程】14. Stream Data Processing
数据库·oracle
倔强的石头10619 小时前
【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式
数据库·金仓数据库
金仓拾光集19 小时前
__金仓数据库平替MongoDB:银行存款系统国产化实践__
数据库·mongodb
流烟默19 小时前
MongoDB入门指南基础篇
数据库·mongodb