当前位置: 首页 > news >正文

MySQL in和exists的取舍

in和exists的取舍

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

in

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

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

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

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

参考文献

  • in和exists的取舍

相关文章:

  • 批量清空或者删除 PDF 文档中作者、创建程序、修改时间等元数据
  • 【Easylive】application.yml文件中都是什么作用
  • Day78 | 灵神 | 反转链表 两两交换链表中的节点
  • 每天学一个 Linux 命令(9):useradd/userdel
  • EDI传输中的OFTP AS2
  • 【模拟CMOS集成电路设计】电荷泵(Charge bump)设计与仿真(示例:栅极开关CP+轨到轨输入运放+基于运放CP)
  • CentOS 7 安装 Kubernetes 1.28.2 集群
  • 企业如何构建风控合规体系?
  • LLM - 推理大语言模型 DeepSeek-R1 论文简读
  • python接口自动化测试:接口数据依赖
  • 蓝桥杯备考---》贪心算法之矩阵消除游戏
  • 理解Java数据库编程之JDBC
  • 用户模块——业务校验工具AssertUtil
  • 10-SpringBoot3入门-整合TX(事务)
  • 【插件】美化html标签的class 属性上的 tailwindcss 类;Prettier-plugin-tailwindcss
  • 数据链路层协议--以太网协议
  • 结构型设计模式。持续更新
  • ToolsSet之:梯度色板
  • MySQL与Redis数据一致性保障方案详解
  • Langflow深度解析:从核心概念到开发实践
  • 网站中的表单怎么做/收录入口在线提交
  • 做电影网站需要注意什么软件/在哪买网站链接
  • 辽宁省网站备案系统/怎么免费给自己建网站
  • 怎样用网站做单笔外贸/seo基础培训
  • 昆山市有没有做网站设计的/深圳网站seo服务
  • 作文网推荐/站长工具seo综合