1.概述

官方:MySQL

STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer processes the tables in a suboptimal order.

翻译过来就是:STRAIGHT_JOIN与 JOIN 类似,只不过左表始终在右表之前读取。这可用于联接优化器以次优顺序处理表的那些(少数)情况。

注意:总的来说STRAIGHT_JOIN只适用于内连接,因为left join、right join已经知道了哪个表作为驱动表,哪个表作为被驱动表,比如left join就是以左表为驱动表,right join反之,而STRAIGHT_JOIN就是在内连接中使用,而强制使用左表来当驱动表,所以这个特性可以用于一些调优,强制改变mysql的优化器选择的执行计划

straight_join完全等同于inner join 只不过,join语法是根据“哪个表的结果集小,就以哪个表为驱动表”来决定谁先载入的,而straight_join 会强制选择其左边的表先载入。

2.案例

参考:https://www.cnblogs.com/mzq123/p/11830429.html 这个实验在MySQL 8中已经不成立了。

创建部门表dept

/*Table structure for table `dept` */DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` (`DEPTNO` int(2) NOT NULL,`DNAME` varchar(14) DEFAULT NULL,`LOC` varchar(13) DEFAULT NULL,PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `dept` */
# 往dept表写数据
insert  into `dept`(`DEPTNO`,`DNAME`,`LOC`) values (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');

创建员工emp表

DROP TABLE IF EXISTS `emp`;CREATE TABLE `emp` (`EMPNO` int(4) NOT NULL,`ENAME` varchar(10) DEFAULT NULL,`JOB` varchar(9) DEFAULT NULL,`MGR` int(4) DEFAULT NULL,`HIREDATE` date DEFAULT NULL,`SAL` int(7) DEFAULT NULL,`COMM` int(7) DEFAULT NULL,`DEPTNO` int(2) DEFAULT NULL,PRIMARY KEY (`EMPNO`),KEY `FK_DEPTNO` (`DEPTNO`),CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `emp` */
# 往员工emp表写数据
insert  into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREDATE`,`SAL`,`COMM`,`DEPTNO`) values (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30),(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30),(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20),(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30),(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30),(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10),(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20),(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10),(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30),(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20),(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30),(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20),(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

先用inner join的看看

EXPLAIN
SELECT a.`EMPNO`,a.`ENAME`,a.`JOB`,a.`SAL`,b.`DNAME`
FROMemp a INNER JOIN dept b ON a.`DEPTNO` = b.`DEPTNO`
ORDER BY a.`EMPNO` ;+----+-------------+-------+------------+------+---------------+-----------+---------+-----------------------+------+----------+---------------------------------+
| id | select_type | table | partitions | type | possible_keys | key       | key_len | ref                   | rows | filtered | Extra                           |
+----+-------------+-------+------------+------+---------------+-----------+---------+-----------------------+------+----------+---------------------------------+
|  1 | SIMPLE      | b     | NULL       | ALL  | PRIMARY       | NULL      | NULL    | NULL                  |    4 |   100.00 | Using temporary; Using filesort |
|  1 | SIMPLE      | a     | NULL       | ref  | FK_DEPTNO     | FK_DEPTNO | 5       | explain_show.b.DEPTNO |    1 |   100.00 | NULL                            |
+----+-------------+-------+------------+------+---------------+-----------+---------+-----------------------+------+----------+---------------------------------+

查看执行计划,可以看出是以dept表为驱动表的,id相同的时候,顺序执行.
explain规则:explain语句结果中,第一行为驱动表(该定律适用于join;子查询的话要分情况)
用STRAIGHT_JOIN连接的写法:

EXPLAIN
SELECT a.`EMPNO`,a.`ENAME`,a.`JOB`,a.`SAL`,b.`DNAME`
FROMemp a STRAIGHT_JOIN dept b ON a.`DEPTNO` = b.`DEPTNO`
ORDER BY a.`EMPNO` ;

从执行计划可以看出强制用emp表做驱动表了.

+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref                   | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
|  1 | SIMPLE      | a     | NULL       | index  | FK_DEPTNO     | PRIMARY | 4       | NULL                  |   14 |   100.00 | Using where |
|  1 | SIMPLE      | b     | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | explain_show.a.DEPTNO |    1 |   100.00 | NULL        |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+

【MySQL】MySQL STRAIGHT JOIN 使用案例以及简介相关推荐

  1. MySQL中Left Join用法

    MySQL中Left Join用法  例子:  user表:  id name  ---------  1 libk  2 zyfon  3 daodao  user_action表:  user_i ...

  2. MySql 之 left join 避坑指南

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:MageekChiu https://segmentfaul ...

  3. MySQL:left join 避坑指南

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:MageekChiu segmentfault.com/a/ ...

  4. Mysql索引基本概念及案例总结(含索引的使用注意事项)

    Mysql索引基本概念及案例总结 键(Key)与索引(Index)关键字的区别 索引是键的列表,当我们定义一个key(外键除外,一般是PRIMARY KEY或者KEY形式)时就会产生对应的索引.一般情 ...

  5. mysql入门简历_MySQL(一)简介与入门

    一.数据库简介 这个博客详细介绍:http://www.cnblogs.com/progor/p/8729798.html 二.MySQL的安装 这个博客详细介绍:https://blog.csdn. ...

  6. mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程

    到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行 ...

  7. MySQL关联left join 条件on与where不同

    以下的文章主要讲述的是MySQL关联left join 条件on与where 条件的不同之处,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两 ...

  8. mysql inner join where_详解mysql 使用left join添加where条件的问题分析

    当前需求: 有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表都有isDel逻辑删除标志. 最开始的错误写法一: SEL ...

  9. MySQL入门 (四) : JOIN 与UNION 查询

    1 使用多个表格 在「world」资料库的「country」表格中,储存世界上所有的国家资料,其中有一个栏位「Capital」用来储存首都资料,不过它只是储存一个编号:另外在「city」表格中,储存世 ...

最新文章

  1. SQL For Xml
  2. 初二计算机辅导记录,(初中信息技术兴趣小组活动记录.doc
  3. 2020-11-1(xml)
  4. MySQL 插入、更新、删除、简单检索
  5. java判断两个日期是否为同一天
  6. Adobe Livecycle ES Workbench
  7. 3_数据分析—数据清洗及特征处理
  8. NB-IOT(6)---NB-IoT物联网行业解决方案
  9. 帝国cms tag生成html,帝国CMS Tag关键词自动锚文本插件 tag标签自动转换为内容内链...
  10. 关于bn层的进一步认识
  11. JavaScript RegExp(正则)
  12. Linux下安装zookeeper集群,以及在window用dubbo和代码测试
  13. 完整的连接器设计手册_连接器卧式插拔力的测试介绍
  14. html chm用浏览器打开,解决chm文件无法使用浏览器打开的问题
  15. 修身齐家治国平天下 读 战国策 和 编程卓越之道 有感
  16. idea中找到VM options选项
  17. 计算机网络启动慢,台式电脑开机网络连接慢的解决办法
  18. 组织人事类主数据业务梳理以及流程编排
  19. 试算平衡表示例图_案例十一试算平衡表
  20. 解决小米手机安装失败(-108)错误

热门文章

  1. 证监会:对贾跃亭、杨丽杰采取终身证券市场禁入措施
  2. 库克:10年内可能离开苹果
  3. iPhone 12s Pro渲染图曝光:屏幕和相机将成升级重点
  4. 贾跃亭的惩罚来了!就这??
  5. 京东拼购弹窗骗局5万人上当?回应:报道内容不实 保留追究权利
  6. 中国人去日本买电饭煲令人痛心!董明珠:难道我泱泱大国造不出吗?
  7. 2019年新iPhone假机模曝光 越看越不顺眼
  8. 网友希望一加7像iPhone XR一样流畅 刘作虎:iPhone很卡
  9. 易到负责人喊话:没钱!易到用车深陷欠薪危机 司机围堵总部讨说法无果
  10. Android7.0 发生的android.os.FileUriExposedException错误