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 相关文章推荐
数据库连接池
Apr 06 MySQL
MySQL命令行操作时的编码问题详解
Apr 14 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
MySQL 数据 data 基本操作
May 04 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 MySQL
MySQL 十大常用字符串函数详解
Mysql中调试存储过程最简单的方法
Jun 30 #MySQL
mysql如何配置白名单访问
Jun 30 #MySQL
Mysql数据库按时间点恢复实战记录
浅析MySQL如何实现事务隔离
MySQL开启事务的方式
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 #MySQL
You might like
加强版phplib的DB类
2008/03/31 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
一个JS翻页效果
2007/07/23 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
解析js如何获取css样式
2016/12/11 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
基于nodejs实现微信支付功能
2017/12/20 NodeJs
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
详解Python 装饰器执行顺序迷思
2018/08/08 Python
关于python多重赋值的小问题
2019/04/17 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
python 线程的五个状态
2020/09/22 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
全球性的女装店:storets
2019/06/12 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
经济担保书范文
2014/04/02 职场文书
单位租房协议书范本
2014/12/04 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书