首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[Mysql]MySQL in和exists的取舍

发布于 2024-08-21 18:44:48
0
397

in和exists的取舍之前说过要小表驱动大表,即先遍历小表再遍历大表,接下来看一下in和exists的区别in先执行子查询,适合于外表大而内表小的情况sql 代码解读复制代码select from...

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

评论
一个月内的热帖推荐
天启
Lv.1普通用户

259

帖子

20

小组

518

积分

赞助商广告
站长交流