TRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间。

首先来解释下STRAIGHT_JOIN到底是用做什么的:

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 puts the tables in the wrong order.

意思就是说STRAIGHT_JOIN与 JOIN 类似,只是左表始终在右表之前读取。这可用于联接优化器以次优顺序处理表的(少数)情况。

接下来我们举个例子进行大致的分析:

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

以上sql大数据量下执行需要30s,是不是很奇怪?明明Table1表的FilterID字段建了索引啊,Table1和Table2的CommonID也建了索引啊。通过explain来分析,你会发现执行计划中表的执行顺序是Table2->Table1。这个时候要略微介绍下驱动表的概念,mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的。

但如下sql的执行时间都少于1s:

select t1.*
from Table1 t1
where t1.FilterID = 1

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID

这个时候STRAIGHT_JOIN就派上用场,我们对sql进行改造如下:

select t1.*
from Table1 t1
STRAIGHT_JOIN  Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

用explain进行分析,发现执行顺序为Table1->Table2,这时就由Table1来作为驱动表了,Table1中相应的索引(覆盖索引)也就用上了,驱动表rows还是全表,执行时间竟然低于1s了。

参考:
https://www.cnblogs.com/heyonggang/p/9462242.html

STRAIGHT_JOIN相关推荐

  1. MySQL HINT:Straight_JOIN

    来自生产环境的朋友.可能都会碰到:            原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕      一个很大可能的原因就是数据分布情况发生了变化      从而导致MyS ...

  2. MySQL小表join大表的正确使用姿势(straight_join 关键字的使用)

    网上有种说法是:由于一般是采用小表join大表的方式(可以提高效率),所以有人说将小表放在左边,让它先执行,记住,这种说法是错误的!!!有例为证: 我们看上例: film inner join fil ...

  3. 【MySQL】性能优化之 straight_join

       研究过或者熟悉oracle性能调优的朋友都知道oracle 提供很多hint 指定from 后的表的连接顺序,如use_hash  ordered ,leading 等,而MySQL 对表的连接 ...

  4. stright 在mysql_MySQL优化的奇技淫巧之STRAIGHT_JOIN

    最近没怎么搞SQL优化,碰巧数据库被慢查询搞挂了,于是拿来练练手. 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* FROM ...

  5. 用STRAIGHT_JOIN优化mysql的执行速度

    优化sql的执行速度,我们通常需要查看EXPLAIN的结果,没有使用索引的加上索引,索引使用不对的也可以强制使用某个索引,但是有些情况下,这2招都不管用,是sql内部的执行顺序不正确,导致速度很慢. ...

  6. mysql natural join_MySQL STRAIGHT_JOIN 与 NATURAL JOIN

    MySQL STRAIGHT_JOIN STRAIGHT_JOIN 是 MySQL 对标准 SQL 的扩展,用于在多表查询时指定表载入的顺序.在 JOIN 表连接中,同样可以指定表载入的顺序,本文只讲 ...

  7. MySQL STRAIGHT_JOIN

    问题 最近在调试一条查询耗时5s多的sql语句,这条sql语句用到了多表关联(inner join),按时间字段排序(order by),时间字段上已经创建了索引(索引名IDX_published_a ...

  8. (转)MySQL联表查询

    资料源于网络 一.内联结.外联结.左联结.右联结的含义及区别 在SQL标准中规划的(Join)联结大致分为下面四种: 1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. ...

  9. 掌握 MySQL 这 19 个骚操作,效率至少提高3倍

    本文我们来谈谈项目中常用的MySQL优化方法,共19条,利用好这19条方法,会让你的效率提升至少3倍. 1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单 ...

  10. MySql中管理百万级要注意些什么东西(转载)

    一.我们可以且应该优化什么? 硬件 操作系统/软件库 SQL服务器(设置和查询) 应 用编程接口(API) 应用程序 二.优化硬件 如果你需要庞大的数据库表 (>2G),你应该考虑使用64位的硬 ...

最新文章

  1. python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...
  2. BZOJ 2007: [Noi2010]海拔
  3. java super extends_Java继承和super的用法
  4. python3.6安装ipython_centos6.5下安装python3.6、pip、ipython
  5. 10067mysql_MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)
  6. iOS多线程:『pthread、NSThread』详尽总结
  7. java判断是否空值
  8. 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
  9. 6to4隧道实验(华为设备)
  10. 法兴用数字证明中国期货市场是真正的投机市
  11. unity下载教育版_新的现场学习系列为Unity教育工作者提供支持
  12. 混沌系统与复杂网络控制,神经网络模型求最优解
  13. 中国城市群产业建设风险与投资发展决策建议报告2022版
  14. SDK开发技术规范总结
  15. 城市按首字母分类,各城市对应的县和区
  16. python输入一段英文_编写程序,用户输入一段英文,然后输出这段英文中所有长度为 3 个字母的单词。_学小易找答案...
  17. intel android 平板,IT百科之英特尔芯平板
  18. 超声波传感器(CHx01ICU-x0201ICU-30201) - 资源抢先看(资料获取)
  19. 防抖(debounce) 和 节流(throttling)的封装使用-最终发布npm
  20. 【图文教程】MySQL 主从

热门文章

  1. ViewPager的翻页动画
  2. Activities(活动)
  3. aviary 图片编辑器
  4. The key to acquiring proficiency in any task is repetition
  5. linux上电自动开启wifi脚本,archlinux 开机自动连接wifi
  6. 疾病负担研究(GBD)-如何绘制GBD相关性图
  7. httpclient发布application/octet-stream
  8. padavan解决没有u盘不能安装nginx问题
  9. matlab gui 作者,MATLAB GUI设计学习手记(第4版)
  10. c#将PDF文件转成图片