为什么这样的SQL执行不会出错?Optimizer Trace深度历险是何方神圣?
- 内容介绍
- 文章标签
- 相关推荐
前言:一段奇怪的SQL冒险
说起的优化器, 我总觉得它像是暗黑森林里的神秘巫师——时而显灵,时而消失。今天咱们就来聊聊那句“select * from t_user_role where user_id in ;”为什么居然不报错,甚至还嫩顺利返回后来啊。别说我刚写完这段文字,咖啡者阝凉了,最后强调一点。。
1️⃣ 子查询到底干了啥?
先别急着敲键盘, 这里有个小剧本:

-- 原始SQL
select * from t_user_role
where user_id in ;
弯道超车。 乍一堪,好像在里找不到user_id字段,于是报错1054 - Unknown column 'user_id' in 'field list'才对呀!可是实际施行却神奇地成功了——这背后到底藏了什么黑幕?
2️⃣ 半连接登场!
MySQL的优化器有个叫transformations_to_nested_joins的特技, 坦白讲... 它会把子查询偷偷变成半连接。半连接可依理解为“内连接+去重”,也就是说:
- 把子查询转成内部表;
- 再和外层表Zuo一次普通的JOIN;
- 再说说去掉重复行。
前言:一段奇怪的SQL冒险
说起的优化器, 我总觉得它像是暗黑森林里的神秘巫师——时而显灵,时而消失。今天咱们就来聊聊那句“select * from t_user_role where user_id in ;”为什么居然不报错,甚至还嫩顺利返回后来啊。别说我刚写完这段文字,咖啡者阝凉了,最后强调一点。。
1️⃣ 子查询到底干了啥?
先别急着敲键盘, 这里有个小剧本:

-- 原始SQL
select * from t_user_role
where user_id in ;
弯道超车。 乍一堪,好像在里找不到user_id字段,于是报错1054 - Unknown column 'user_id' in 'field list'才对呀!可是实际施行却神奇地成功了——这背后到底藏了什么黑幕?
2️⃣ 半连接登场!
MySQL的优化器有个叫transformations_to_nested_joins的特技, 坦白讲... 它会把子查询偷偷变成半连接。半连接可依理解为“内连接+去重”,也就是说:
- 把子查询转成内部表;
- 再和外层表Zuo一次普通的JOIN;
- 再说说去掉重复行。

