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 07 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 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支持断点续传的源码
2010/05/16 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
跟我学Laravel之路由
2014/10/15 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
python下MySQLdb用法实例分析
2015/06/08 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
python pycharm的安装及其使用
2019/10/11 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
基于python代码批量处理图片resize
2020/06/04 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
绩效工资分配方案
2014/01/18 职场文书
如何写辞职书
2015/02/26 职场文书
酒店前台辞职书
2015/02/26 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
浅谈Redis的事件驱动模型
2022/05/30 Redis