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存储时间出现不一致的问题
Apr 28 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
新手入门Mysql--概念
Jun 18 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
mysql 获取时间方式
Mar 20 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
Mysql开启外网访问
May 15 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 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中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
PHP中->和=>的含义及使用示例解析
2020/08/06 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
python中星号变量的几种特殊用法
2016/09/07 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
美国糖果店:Sugarfina
2019/02/21 全球购物
医学院护理专业应届生求职信
2013/11/12 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
营销学习心得体会
2014/09/12 职场文书
2014年医务科工作总结
2014/12/18 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle