mysql left join快速转inner join的过程


Posted in MySQL onJune 30, 2021

在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样。

mysql left join快速转inner join的过程

mysql left join快速转inner join的过程

对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = 'LOC'过滤条件; 保证shopInfo的记录非NULL,因此left join在优化过程中可以转为inner join。 那么O和S的JOIN顺序就是可以交换的。

验证结论:

创建表:

--班级表
CREATE TABLE T_CLASS(
  class_id int not null,
  class_name VARCHAR2(100)
);
添加索引
alter table T_CLASS add index inx_class_id(class_id);
--学生表
CREATE TABLE T_STUDENT(
  student_id int not null,
  class_id int not null,
  student_name VARCHAR(100),
  age int,
  sex int 
)
添加索引
alter table T_STUDENT add index index_age(AGE);
--班级数据
insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (1, '一班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (2, '二班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (3, '三班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (4, '四班');

insert into T_CLASS (CLASS_ID, CLASS_NAME)
values (5, '五班');
--学生数据
insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (1, 1, '李1', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (2, 1, '李2', 2, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (3, 1, '李3', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (4, 2, '李4', 4, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (5, 2, '李5', 3, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (6, 2, '李6', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (7, 3, '李7', 6, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (8, 3, '李8', 4, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (9, 2, '李9', 2, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (10, 2, '李10', 3, '1');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (11, 3, '李11', 3, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (12, 2, '李12', 8, '2');

insert into T_STUDENT (STUDENT_ID, CLASS_ID, STUDENT_NAME, AGE, SEX)
values (13, 1, '李13', 6, '2');

案例1:B表有where条件且不为null

mysql left join快速转inner join的过程

案例2: A表和B表均有where条件且不为null

mysql left join快速转inner join的过程

案例3:A表和B表均有where条件且不为null,删除B表索引

mysql left join快速转inner join的过程

结论:

left join 只有被关联表有where条件,且其过滤条件优于关联表的情况下,mysql优化器才转成inner join.

到此这篇关于mysql left join快速转inner join的过程的文章就介绍到这了,更多相关mysql left join inner join内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL索引知识的一些小妙招总结
May 10 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
Jul 01 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 MySQL
MySQL主从切换的超详细步骤
Jun 28 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
MySQL 十大常用字符串函数详解
Mysql中调试存储过程最简单的方法
Jun 30 #MySQL
mysql如何配置白名单访问
Jun 30 #MySQL
Mysql数据库按时间点恢复实战记录
浅析MySQL如何实现事务隔离
MySQL开启事务的方式
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 #MySQL
You might like
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
javascript引用对象的方法
2007/01/11 Javascript
JavaScript 特殊字符
2007/04/05 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
Python解析xml中dom元素的方法
2015/03/12 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
python制作图片缩略图
2019/04/30 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Python如何实现线程间通信
2020/07/30 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
比利时家具购买网站:Home24
2019/01/03 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
后勤部经理岗位职责
2014/02/23 职场文书
2015年检验科工作总结
2015/04/27 职场文书
高效课堂教学反思
2016/02/24 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS