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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值