in子查询的执行可能被优化为连接查询

in子查询的SQL,正常情况执行计划会有两行两个id,来代表有两个Select查询

可是优化器在优化之后,可能会将子查询优化成连接查询,下面看看这种情况(有很多种情况我只举例这种):

先建表,这里我建好了:

执行SQL:

复制代码
mysql> EXPLAIN
    -> SELECT *
    -> FROM user u
    -> WHERE u.id IN (
    ->     SELECT r.user_id
    ->     FROM recharge r
    ->     WHERE r.user_id = 1
    -> );

执行结果:

说明它真的被优化成了连接查询,而且是firstMatch的半连接查询匹配,也就是类似于Exists的算法存在即命中,而不是像in那种一直匹配的机制

相关推荐
nhdh11 小时前
B+树揭秘:MySQL索引核心原理全解析
数据结构·b树·mysql
余槐i13 小时前
MySQL 深分页从 4 秒到 60 毫秒:延迟关联减少回表的实测与代价
mysql·性能优化·sql优化·执行计划·慢查询优化
PHP实战开发录16 小时前
MySQL字段加索引为什么没变快
数据库·mysql·php·开发
天衍四九-16 小时前
【无标题】
前端·spring boot·mysql·nginx·docker
Lysander.Jovian17 小时前
mysql数据库基本使用
mysql
Shadow(⊙o⊙)17 小时前
MySQL索引
数据库·mysql
fb_1234518 小时前
MySQL运维实战:备份恢复+主从复制+读写分离+MHA高可用(超详细手把手教程)
运维·mysql·oracle
杨云龙UP19 小时前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql
stark张宇19 小时前
从页、区、段到 B+Tree:InnoDB 表空间如何组织数据?
mysql
JAVA面经实录91721 小时前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试