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 06 MySQL
mysql批量新增和存储的方法实例
Apr 07 MySQL
MySQL update set 和 and的区别
May 08 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 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优于Node.js的五大理由分享
2012/09/15 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
javascript 对象的定义方法
2007/01/10 Javascript
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
js获取Get值的方法
2016/09/29 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python的Tornado框架异步编程入门实例
2015/04/24 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
python 远程统计文件代码分享
2015/05/14 Python
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Python通过文本和图片生成词云图
2020/05/21 Python
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
公司成立感言
2014/01/11 职场文书
英语感恩演讲稿
2014/01/14 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA