首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL in和exists的取舍

MySQL in和exists的取舍

作者头像
每周聚焦
发布于 2024-08-16 17:48:00
发布于 2024-08-16 17:48:00
3220
举报

in和exists的取舍

之前说过要小表驱动大表,即先遍历小表再遍历大表,接下来看一下in和exists的区别

in

先执行子查询,适合于外表大而内表小的情况

代码语言:javascript
复制
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

以外层表作为驱动表,外层表先被访问,适合于外表小而内表大的情况

代码语言:javascript
复制
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了

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • in和exists的取舍
    • in
    • exists
    • 结论
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档