大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子
版本 :Server version: 8.0.22 MySQL Community Server - GPL
目标:想要查找没有显示主键的表
第一步:查询所有用户表
SELECT
第二步 : 查找所有包含显示主键的表
第三步:两个结果集进行JOIN ,找到差异
SELECT
同样的思路我们在
Server version: 5.7.28-log MySQL Community Server (GPL)
SELECT
可以看到在5.7中就可以得到我们想要的答案,但8.0.22中就不行。
我们现在开始分析其原因,首先我们来比较下不同版本之间的SQL的执行计划。
5.7
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------------------------------------------------------+
我们可以看到解析到的SQL 中包含 isnull(`c`.`TABLE_NAME`)
8.0
从解析到的SQL中我们没有发现 TABLE_NAME IS NULL;
相关的内容!说明在解析的过程中由于优化器的问题 解析错误了 !
我们把视图合并功能先关下看看
set session optimizer_switch='derived_merge=off'
结果发现 TABLE_NAME IS NULL;
又出现了!!最终发现是视图合并搞的鬼 !视图合并功能是5.7添加的,非常好,但是有时候 就会出现一些问题,但是掌握解决问题的方法和思路,就会从容应对!
我的新一轮的SQL 优化课 即将在春节后开课
我是知数堂SQL 优化班老师~ ^^
如有关于SQL优化方面疑问和一起交流的请加 并 且 @兔子@知数堂SQL优化
高性能MySQL,SQL优化群 有叶金荣,吴炳锡 两位大 神坐镇 :579036588
欢迎加入 知数堂大家庭。
我的微信公众号:SQL开发与优化(sqlturning)
扫码直达宝藏课程
本文分享自微信公众号 - 老叶茶馆(iMySQL_WX)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。