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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
MySQL表的增删改查(基础)
Apr 05 MySQL
详解MySQL 用户权限管理
Apr 20 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
Mysql数据库命令大全
May 26 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
MySQL 数据表操作
May 04 MySQL
MySQL 计算连续登录天数
May 11 MySQL
MySQL 十大常用字符串函数详解
Mysql中调试存储过程最简单的方法
Jun 30 #MySQL
mysql如何配置白名单访问
Jun 30 #MySQL
Mysql数据库按时间点恢复实战记录
浅析MySQL如何实现事务隔离
MySQL开启事务的方式
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 #MySQL
You might like
为查询结果建立向后/向前按钮
2006/10/09 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python global全局变量函数详解
2018/09/18 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Python Django 简单分页的实现代码解析
2019/08/21 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python阶乘求和的代码详解
2020/02/14 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
Python实现壁纸下载与轮换
2020/10/19 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
new修饰符是起什么作用
2015/06/28 面试题
预备党员自我批评思想汇报
2014/10/10 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
党员先进事迹材料
2014/12/19 职场文书
亮剑观后感600字
2015/06/05 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书