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 07 MySQL
MySQL中你可能忽略的COLLATION实例详解
May 12 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MySQL命令无法输入中文问题的解决方式
Aug 30 MySQL
mysql函数全面总结
Nov 11 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
关于mysql中string和number的转换问题
Jun 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中include/require/include_once/require_once使用心得
2016/08/28 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
PHP7 标准库修改
2021/03/09 PHP
Using the TextRange Object
2006/10/14 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
javascript常见用法总结
2014/05/22 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
Django在win10下的安装并创建工程
2017/11/20 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
地质灾害防治方案
2014/05/14 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
经济纠纷起诉状
2015/05/20 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
JavaScript分页组件使用方法详解
2021/07/26 Javascript
MYSQL 运算符总结
2021/11/11 MySQL
SQL Server中的游标介绍
2022/05/20 SQL Server