1.什么是子查询
将一个查询块嵌套在另一个查询块的WHERE字句或HAVING短语的条件中查询块称为子查询或内层查询。
子查询根据相关性划分为相关子查询和非相关性子查询。执行计划的type类型分别对应SUBQUERY和DEPENDENT SUBQUERY。
子查询例如: 执行计划显示为子查询,使用是否使用子查询,还得看执行计划,比如有时使用int子查询,会被优化器等价改写成连接查询。子查询只执行一次,被当做外部查询的条件。
关联子查询: 当外部查询和子查询会存在相关性时,执行计划就有可能走关联子查询。
例如下:关联子查询效率很低,外部查询每一条行数据,内部都要执行一次查询。这类查询一般可以等价改写成连接查询,性能会高些,尤其在8.0后加入了hash连接,表连接的性能大大提高了。
2. in子查询和exist
网上有很多in子查询和exist比较的例子,
exist多数情况下,在不被改写的情况下通常会走相关子查询。对于外表的每行数据,在子查询内进行匹配,找到一个满足的结果,就会立即返回,不会再继续匹配,not exist也类似。
很多说exist的性能会比i