问题

通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.*

FROM post

INNER JOIN post_tag ON post.id = post_tag.post_id

WHERE post.status = 1 AND post_tag.tag_id = 123

ORDER BY post.created DESC

LIMIT 100

说明:因为post和tag是多对多的关系,所以存在一个关联表post_tag。

试着用EXPLAIN查询一下SQL执行计划(篇幅所限,结果有删减): +----------+---------+-------+-----------------------------+

| table | key | rows | Extra |

+----------+---------+-------+-----------------------------+

| post_tag | tag_id | 71220 | Using where; Using filesort |

| post | PRIMARY | 1 | Using where |

+----------+---------+-------+-----------------------------+

下面给出优化后的SQL,唯一的变化就是把连接方式改成了「STRAIGHT_JOIN」: SELECT post.*

FROM post

STRAIGHT_JOIN post_tag ON post.id = post_tag.post_id

WHERE post.status = 1 AND post_tag.tag_id = 123

ORDER BY post.created DESC

LIMIT 100

试着用EXPLAIN查询一下SQL执行计划(篇幅所限,结果有删减): +----------+----------------+--------+-------------+

| table | key | rows | Extra |

+----------+----------------+--------+-------------+

| post | status_created | 119340 | Using where |

| post_tag | post_id | 1 | Using where |

+----------+----------------+--------+-------------+

对比优化前后两次EXPLAIN的结果来看,优化后的SQL虽然「rows」更大了,但是没有了「Using filesort」,综合来看,性能依然得到了提升。

解释

对第一条SQL而言,为什么MySQL优化器选择了一个耗时的执行方案?对第二条SQL而言,为什么把连接方式改成STRAIGHT_JOIN之后就提升了性能?

这一切还得从MySQL对多表连接的处理方式说起,首先要确定以谁为驱动表,也就是说以哪个表为基准,在处理此类问题时,MySQL优化器采用了简单粗暴的解决方法:哪个表的结果集小,就以哪个表为驱动表,通常这都是最佳选择。

说明:在EXPLAIN结果中,第一行出现的表就是驱动表。

继续post连接post_tag的例子,MySQL优化器有如下两个选择,分别是: 以post为驱动表,通过status_created索引过滤,结果集119340行 以post_tag为驱动表,通过tag_id索引过滤,结果集71220行

显而易见,post_tag过滤的结果集更小,所以MySQL优化器选择它作为驱动表,可悲催的是我们还需要以post表中的created字段来排序,也就是说排序字段不在驱动表里,于是乎不可避免的出现了「Using filesort」,从而导致慢查询。

知道了来龙去脉,优化起来就容易了。头等大事是务必保证排序字段在驱动表中,所以必须以post是驱动表,于是乎「STRAIGHT_JOIN」就成了答案,它强制了连接顺序。

不过我总觉得「STRAIGHT_JOIN」这种非标准的语法属于奇技淫巧的范畴,能不用尽量不用,毕竟多数情况下,MySQL优化器都能做出正确的选择。

mysql straight join_在MySQL中使用STRAIGHT_JOIN的教程相关推荐

  1. mysql数据库管理文件_数据库管理中文件的使用教程

    摘要:这篇MySQL栏目下的"数据库管理中文件的使用教程",介绍的技术点是"数据库管理.使用教程.数据库.的使用.文件.管理",希望对大家开发技术学习和问题解决 ...

  2. mysql 修改结束符_MySQL数据库中DELIMITER修改结束符教程及应用实例

    关于DELIMITER 在MySQL中默认的结束符DELIMITER是;,它用于标识一段命令是否结束.在默认情况下,在命令行客户端中,如果有一行命令以;结束,那么回车后,MySQL将会执行该命令. 修 ...

  3. 远程连接docker中的mysql容器_docker构建mysql容器及Navicat 远程连接

    1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 首先建立所需要的 文件夹: docker run - ...

  4. mysql数据库备份总结_mysql中mysqlhotcopy备份数据库总结

    mysqlhotcopy是mysql数据库中一个备份工具,相对于mysqldump是一个快速文件意义上的COPY,mysqlhotcopy是一个数据库端的SQL语句集合. mysqlhotcopy用法 ...

  5. mysql主从同步linux,linux中部署mysql主从同步示例详解(绝对经典,看了必会)

    准备两台服务器并安装MySQL5.7 master服务器 192.168.254.132 slave服务器 192.168.254.136 确保两台服务器安装的mysql版本一致,本测试使用的是mys ...

  6. 阿里云rds mysql数据库数据恢复到ecs中

    背景: aliyun上的rds数据库快满了,于是删除了某个备份的表 后面大boss说是有用的表,需要恢复回来,阿里云有7天内的物理全量备份(通过percona-xtrabackup备份的) 第一时间应 ...

  7. xp 安装mysql数据库_Windows XP系统中安装MySQL5.5.28数据库图文教程

    Windows XP系统中安装MySQL5.5.28数据库图文教程 2014-07-13 16:35来源:中国存储网 导读:MySQL数据库的安装一共分为两个部分:数据库的安装和数据库的配置.一.My ...

  8. mysql数据库优化课程---15、mysql优化步骤(mysql中最常用最立竿见影的优化是什么)...

    mysql数据库优化课程---15.mysql优化步骤(mysql中最常用最立竿见影的优化是什么) 一.总结 一句话总结:索引优化最立竿见影 索引优化:不然有多少行要扫描多少次,1亿行大概是5到10分 ...

  9. mysql indentify by_测试工作中常用到的sql命令!!!

    编写背景: 深圳下了一周的雨,天阴沉阴沉的,好想晒晒阳光,心情快被发霉了.这周运气很好,bugzilla和TestLink安装很顺利,mysql数据库的备份和恢复.bugzilla和testlink升 ...

  10. linux mysql cpu 高,Linux系统中关于Mysql数据库导致CPU很高的问题解决

    Linux系统中关于Mysql数据库导致CPU很高的问题解决 发布时间:2007-11-19 00:01:12来源:红联作者:spworks 服务器环境 Liunx AS4 + PHP5 + Mysq ...

最新文章

  1. android.view.ViewRoot$CalledFromWrongThreadException的解决办法
  2. jenkins中配置Ant
  3. Remove Nth Node From End of List
  4. Debug enterprise search menu
  5. c语言 在txt文件中搜索关键词_网络推广外包—网络推广外包如何在搜索引擎中体现关键词优化效果...
  6. win10系统能做域服务器吗,Win10 LTSC 加入 Windows Server 2019 域服务器
  7. git 应用 cherry-pick
  8. HDU4757 Tree(可持久化Trie)
  9. ARM裸机开发(三)SDRAM编程
  10. MPU6050六轴传感器的原理及编程说明
  11. 阿里云实现人脸登录(人脸库 OSS)
  12. 《计算机操作系统》思维导图
  13. 快递扫码入库PC系统
  14. turtle库绘图:绘制QQ所有表情
  15. Myeclipse项目内容没有报错但是项目上面却有红色叉叉
  16. C#一个解决方案创建多个项目
  17. Android点将台:烽火狼烟[-Handler-]
  18. 方舟原始恐惧mod生物代码_重磅!《命令与征服》和《红色警戒》源代码在GitHub公布了...
  19. 前端工作过程遇到的问题总结(九)
  20. 5个超实用的小众软件,让你的电脑体验感提升200%

热门文章

  1. 使用WIFI通讯,手机秒变单片机大屏显示器
  2. 【英语】考研英语红宝书单词——必考词
  3. 基于sammy的前端mvc框架
  4. 从360图书馆抓取全球国家的中文名与英文名(requests_html)
  5. 计算机网络工程这专业都学什么,网络工程专业学什么
  6. 想查看微信好友撤回的消息?Python帮你搞定
  7. 关于视频图像dither
  8. CCR, CCD, CDA, EMR, PHR
  9. 深度优先搜索与广度优先搜索
  10. 使用React.js和appbase.io构建类似Twitter的Search Feed