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 05 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
mysql脏页是什么
Jul 26 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 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版本号
2006/10/09 PHP
一些关于PHP的知识
2006/11/17 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
简单的php购物车代码
2020/06/05 PHP
js加解密 脚本解密
2008/02/22 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
Python输出带颜色的字符串实例
2017/10/10 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
教师应聘自荐信范文
2014/03/14 职场文书
大学生个人求职信例文
2014/07/07 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
小学毕业感言100字
2015/07/30 职场文书
2016年离婚协议书范文
2016/03/18 职场文书