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 COUNT函数的使用与优化
May 10 MySQL
正确使用MySQL update语句
May 26 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
May 27 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MySQL数据库⾼可⽤HA实现小结
Jan 22 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
mysql 排序失效
May 20 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函数 serialize()和unserialize()
2012/02/04 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
PHP加密解密类实例代码
2016/07/20 PHP
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
解决python "No module named pip" 的问题
2018/10/13 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
Python3几个常见问题的处理方法
2019/02/26 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
如何在sublime编辑器中安装python
2020/05/20 Python
如何完美的建立一个python项目
2020/10/09 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
化工专业推荐信范文
2013/11/28 职场文书
授权委托书
2014/09/17 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2014年德育工作总结
2014/11/20 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书