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数据库按时间点恢复实战记录
Jun 30 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
MySQL 数据表操作
May 04 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL池化框架学习接池自定义
Jul 23 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 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+dbfile开发小型留言本
2006/10/09 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
微信小程序progress组件使用详解
2018/01/31 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
[43:51]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS Secret
2018/03/31 DOTA
Python备份Mysql脚本
2008/08/11 Python
python实现扫描日志关键字的示例
2018/04/28 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
银行自荐信范文
2013/10/07 职场文书
领导的自我鉴定
2013/12/28 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
领班岗位职责范文
2014/02/06 职场文书
会务接待方案
2014/02/27 职场文书
五水共治一句话承诺
2014/05/30 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
学生病假条怎么写
2015/08/17 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
教你部署vue项目到docker
2022/04/05 Vue.js
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android