为什么这样的SQL执行不会出错?Optimizer Trace深度历险是何方神圣?

2026-04-27 21:598阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

前言:一段奇怪的SQL冒险

说起的优化器, 我总觉得它像是暗黑森林里的神秘巫师——时而显灵,时而消失。今天咱们就来聊聊那句“select * from t_user_role where user_id in ;”为什么居然不报错,甚至还嫩顺利返回后来啊。别说我刚写完这段文字,咖啡者阝凉了,最后强调一点。。

1️⃣ 子查询到底干了啥?

先别急着敲键盘, 这里有个小剧本:

这样的SQL执行为什么不会报错?optimizer_trace深度历险

-- 原始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执行为什么不会报错?optimizer_trace深度历险

-- 原始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;
  • 再说说去掉重复行。
阅读全文