mysql子查询优化(in和exist区别)

1.什么是子查询

将一个查询块嵌套在另一个查询块的WHERE字句或HAVING短语的条件中查询块称为子查询或内层查询。

子查询根据相关性划分为相关子查询和非相关性子查询。执行计划的type类型分别对应SUBQUERY和DEPENDENT SUBQUERY。
子查询例如: 执行计划显示为子查询,使用是否使用子查询,还得看执行计划,比如有时使用int子查询,会被优化器等价改写成连接查询。子查询只执行一次,被当做外部查询的条件。
在这里插入图片描述
关联子查询: 当外部查询和子查询会存在相关性时,执行计划就有可能走关联子查询。
例如下:关联子查询效率很低,外部查询每一条行数据,内部都要执行一次查询。这类查询一般可以等价改写成连接查询,性能会高些,尤其在8.0后加入了hash连接,表连接的性能大大提高了。
在这里插入图片描述

2. in子查询和exist

网上有很多in子查询和exist比较的例子,
exist多数情况下,在不被改写的情况下通常会走相关子查询。对于外表的每行数据,在子查询内进行匹配,找到一个满足的结果,就会立即返回,不会再继续匹配,not exist也类似。
很多说exist的性能会比i

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值