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 InnoDB ReplicaSet(副本集)简单介绍
Apr 24 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 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/08/08 PHP
详谈PHP编码转换问题
2015/07/28 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
javascript 数据存储的常用函数总结
2017/06/01 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python连接oracle数据库实例
2014/10/17 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
学习和使用python的13个理由
2019/07/30 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
python有几个版本
2020/06/17 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
abstract是什么意思
2012/02/12 面试题
入党申请人的自我鉴定
2013/12/01 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
学生病假条范文
2015/08/17 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
Minikube搭建Kubernetes集群
2022/03/31 Servers