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 18 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
May 27 MySQL
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
mysql 生成连续日期及变量赋值
Mar 20 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL 十大常用字符串函数详解
Mysql中调试存储过程最简单的方法
Jun 30 #MySQL
mysql如何配置白名单访问
Jun 30 #MySQL
Mysql数据库按时间点恢复实战记录
浅析MySQL如何实现事务隔离
MySQL开启事务的方式
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 #MySQL
You might like
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
Jquery attr("checked") 返回checked或undefined 获取选中失效
2013/10/10 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
基于Python中的yield表达式介绍
2019/11/19 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
家长对孩子的感言
2014/03/10 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
青岛海底世界导游词
2015/02/11 职场文书
python数字图像处理之图像的批量处理
2022/06/28 Python