MySQL系列之STRAIGHT JOIN用法简介

引用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的优化器选择的执行计划

ok,写个例子进行实验

创建部门表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` ;

查看执行计划,可以看出是以dept表为驱动表的

ps:对于执行计划的知识可以参考我之前博客:MySQL调优之Explain执行计划学习笔记

用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表做驱动表了,而且不走索引,全表扫描了,之前的还是ref,是有走索引的

MySQL系列之STRAIGHT JOIN用法简介相关推荐

  1. MySQL系列之Natural Join用法

    Natural join即自然连接,natural join等同于inner join或inner using,其作用是将两个表中具有相同名称的列进行匹配 用https://www.w3resourc ...

  2. MySQL应用之CROSS JOIN用法(有时挺管用)

    目录 cross join简介 cross join用法 本博客翻译自两篇博客的: http://www.mysqltutorial.org/mysql-cross-join/ https://www ...

  3. mysql数据库inner join_inner join用法是什么

    inner join(等值连接):只返回两个表中联结字段相等的行. left join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录. right join(右联接):返回包括右表中的 ...

  4. mysql中的left join用法 (及多条件查询

    语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2  说明:table1, table2参数用于指定要将记录组 ...

  5. C语言实用算法系列之二级指针用法简介

    一.几个知识点 内存四区:栈.全局(静态),常量区,除此以外剩余的空间暂时不能随意使用:除此以外剩余的空间只要通过malloc函数申请一下,就可以使用了: 申请一个堆上的单个int变量的方法:int* ...

  6. MySQL中Left Join用法

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

  7. 数据基础---mysql数据库操作(二)---JOIN用法

    mysql的john用法总结 左"的笛卡尔积和"右"的笛卡尔积 根据mysql join 连接的方式我把它归为两类,"左"的笛卡尔积和"右& ...

  8. MYSQL学习笔记 (三)JOIN用法

    数据库的操作分开增删改查,其中查询操作基本占系统的90%,大家所说的优化SQL语句基本是优化查询语句.接下来将学习JOIN的用法,JOIN包括:INNER JOIN(内连接).LEFT JOIN(左外 ...

  9. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇

    Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...

  10. MySQL的JOIN用法

    全文共925个字,10张图,预计阅读时间6分钟. 数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据.连接分为三类:内连接.外连接.全连接.另外还有 ...

最新文章

  1. HTML基础第三讲---字体
  2. autojs怎么post协议_autojs QQ群post签到(五)
  3. [html] html5的Notification桌面通知如何请求权限?
  4. 【HTML】底部弹窗插件代码
  5. 苹果ipa软件包破解笔记
  6. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开...
  7. OpenShift 4 - 运行Spark和Zeppelin大数据应用
  8. STL札记2(序列容器vector、list、deque)
  9. 日期选择窗口_Excel攻略|添加日期、智能填充、多窗口同步、两列(行)交换
  10. linux 连接到阿里云服务器
  11. Windows防火墙设置
  12. Office - Excel如何查询重复值数量
  13. matlab求非线性方程的根,求非线性方程的根
  14. licode的ios最新版本的接入
  15. 五. Tomcat 常见问题解决及面试题
  16. K8S环境部署jaeger-all-in-one
  17. Android SearchView
  18. 基于 jsp+servlet+mysql 开发旅游推介网站和后台管理系统(maven项目)
  19. 我们需要怎样的流程管理系统?
  20. SpringBoot 系列教程(六十):SpringBoot整合Swagger-Bootstrap-Ui

热门文章

  1. 魂斗罗4 java 7723_FC魂斗罗4游戏下载-魂斗罗4FC无敌修改版下载-电玩咖
  2. 五、网络整理BAT脚本——字符串常规操作
  3. 51cto 检测ip地址冲突_IP地址冲突解决办法
  4. java基础第十五篇之IO流和递归算法
  5. 一、pytorch环境配置
  6. 免费的caj转word批量转换方法
  7. 微信关注公众号跳转关注页面
  8. 安卓手机管理器_iOS苹果手机最好用的三款文件管理器APP
  9. android dialog遮挡键盘,彻底解决软键盘遮挡DialogFragment
  10. 什么是集合竞价和连续竞价