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中你可能忽略的COLLATION实例详解
May 12 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
Mysql 如何查询时间段交集
Jun 08 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL深分页问题解决思路
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
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
详解Python3注释知识点
2019/02/19 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
文案策划求职信
2014/04/14 职场文书
科学发展观演讲稿
2014/09/11 职场文书
入党现实表现材料
2014/12/23 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python