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

执行顺序通常是mysql内部优化器根据表预测的大小,索引等等情况自动判断的,但是某些情况下会判断错误,这个时候我们就需要调整执行顺序。

mysql8.0以上有优化器提示(Optimizer Hints),可以详细控制优化器的执行顺序,比较复杂。但是生产环境是5.6,无法使用。

8.0以下可以使用STRAIGHT_JOIN 来调整执行顺序,用法也比较简单,用STRAIGHT_JOIN 来代替JOIN就可以了,mysql会按照书写的顺序从左到右执行,这样我们就控制了mysql执行顺序。

下面我们来看一个具体的例子,有4个表INNER JOIN连接,还有一个EXISTS条件

 SELECT*FROMmm_detail aINNER JOIN  mm_domain d ON d.DOMAIN=a.DOMAININNER JOIN  mm_media c ON c.DOMAIN_ID=d.DOMAIN_IDINNER JOIN  mm_url x ON x.MEDIA_ID=c.MEDIA_IDWHEREa.URL_TYPE=1AND NOT EXISTS(SELECT 1 FROM mm_detail y WHERE y.URL_TYPE=3 AND y.URL_UNIQUE=x.URL_UNIQUE AND y.GROUP_NO=a.GROUP_NO)

由于数据量比较大,上面这个sql要执行几个小时以上,具体是几个小时不知道,没有耐心等待

id select_type table type poosible_keys key key_ken ref rows Extra
1 PRIMARY x ALL media_id       238426 Using where
1 PRIMARY c eq_ref PRIMARY,DOMAIN_ID PRIMARY 8 media.x.MEDIA_ID 1  
1 PRIMARY d eq_ref PRIMARY,domain PRIMARY 4 media.c.DOMAIN_ID 1  
1 PRIMARY a ref IDX_SEARCH,IDX_DOMAIN,IDX_URL_TYPE IDX_DOMAIN 768 media.d.DOMAIN 26 Using index condition; Using where
2 DEPENDENT SUBQUERY y ref IDX_SEARCH,IDX_GROUP_NO,IDX_URL_TYPE,IDX_URL_UNIQUE IDX_SEARCH 2111 const,media.a.GROUP_NO,media.x.URL_UNIQUE 1 Using index

从EXPLAIN的结果可以看到执行顺序,先执行了包含EXISTS的x表,并且是遍历全表,由于x表数据量最大,导致非常慢,这个执行顺序显然是错误的

下面我用STRAIGHT_JOIN  代替 INNER JOIN,强制查询顺序,执行时间变成21秒,差距非常大

 SELECT*FROMmm_detail aSTRAIGHT_JOIN  mm_domain d ON d.DOMAIN=a.DOMAINSTRAIGHT_JOIN  mm_media c ON c.DOMAIN_ID=d.DOMAIN_IDSTRAIGHT_JOIN  mm_url x ON x.MEDIA_ID=c.MEDIA_IDWHEREa.URL_TYPE=1AND NOT EXISTS(SELECT 1 FROM mm_detail y WHERE y.URL_TYPE=3 AND y.URL_UNIQUE=x.URL_UNIQUE AND y.GROUP_NO=a.GROUP_NO)
id select_type table type poosible_keys key key_ken ref rows Extra
1 PRIMARY a ref IDX_SEARCH,IDX_DOMAIN,IDX_URL_TYPE IDX_SEARCH 4 const 223000 Using where
1 PRIMARY d eq_ref PRIMARY,domain domain 302 media.a.DOMAIN 1 Using index condition
1 PRIMARY c ref PRIMARY,DOMAIN_ID DOMAIN_ID 4 media.d.DOMAIN_ID 2  
1 PRIMARY x ref media_id media_id 9 media.c.MEDIA_ID 264 Using where
2 DEPENDENT SUBQUERY y ref IDX_SEARCH,IDX_GROUP_NO,IDX_URL_TYPE,IDX_URL_UNIQUE IDX_SEARCH 2111 const,media.a.GROUP_NO,media.x.URL_UNIQUE 1 Using index

从EXPLAIN的结果我们看到,执行顺序按照sql的书写顺序,都使用了索引,这个就是速度变快的原因。

用STRAIGHT_JOIN优化mysql的执行速度相关推荐

  1. 数据库-优化-MYSQL的执行顺序

    MySQL的执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只 ...

  2. 优化SQL的执行速度

    2019独角兽企业重金招聘Python工程师标准>>> 在项目开发中,页面的反应速度是非常重要的,改善页面反应速度的方法有很多. 但一般的问题多数是出现在数据库访问的SQL上面. 比 ...

  3. 第1章计算机系统概述__计算机系统性能评价之2_用执行速度进行性能评估

    最早用来衡量计算机性能的速度指标是每秒钟完成单个运算(如加法) 指令的条数. 指令速度所用的计量单位为MIPS (Million Instructions Per Second) ,其含义是平增多每秒 ...

  4. Mysql中查询速度的优化

    2019独角兽企业重金招聘Python工程师标准>>> mysql中查询速度的优化 1.查看每一个表的数据量 2.left join的时候尽量减少表的大小,通过临时表,查询条件去限制 ...

  5. mysql 查询执行计划_mysql8 参考手册--了解查询执行计划,使用EXPLAIN优化查询

    根据表,列,索引的详细信息以及WHERE子句中的条件,MySQL优化器考虑了许多技术来有效执行SQL查询中涉及的查找.无需读取所有行即可执行对巨大表的查询:可以执行涉及多个表的联接,而无需比较行的每个 ...

  6. MySQL 内部执行优化策略总结

    MySQL 内部执行优化策略总结 前言 一.查询优化策略 1. ICP 索引条件下推 2. MRR 多范围读取优化(批量回表) 3. 索引合并 (1) Intersection 合并 (2) Unio ...

  7. iar代码优化影响运行速度吗_IAR中优化等级对Kinetis FGPIO执行速度的影响

    在灯光控制.IO模拟Flex Bus等很多应用中,对GPIO的翻转速度有很高的要求,M0+内核中集成了一个特定的single-cycle I/O port,Kinetis中我们称之为Fast GPIO ...

  8. mysql无序id怎么优化limit_MYSQL分页limit速度太慢优化方法

    原标题:MYSQL分页limit速度太慢优化方法 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一 ...

  9. Mysql的执行顺序与优化分析

    编写顺序与执行顺序分析 一条完整的sql语句编写流程应该如下: select distinct 查询字段   from 表名  JOIN 表名    ON 连接条件   where 查询条件   gr ...

最新文章

  1. gltf与glb格式转换 gltf-pipeline、binary-gltf-utils
  2. SAP RETAIL 特征参数文件(Characteristic Profile) II
  3. JAVA_OPTS 参数
  4. 使用Axure制作无限循环展示图片效果
  5. Python入门100题 | 第018题
  6. js 校验验证码 知识点
  7. 在一个电子商务网站应用中,涉及的实体信息类有很多,比如用户类User和用户地址类Address; 而每一个实体类的对象信息要存储到相应的数据库表中,如userTable和addressTable。
  8. 经典汉诺塔(Java初学递归篇)
  9. [HAOI2016]食物链
  10. mysql_根据身份证号识别性别、年龄、所在省份
  11. 一:ActiveMQ知识整理
  12. jdbc连接oracle查询数据库,JDBC连接Oracle数据库,并操作数据库,查询表
  13. No package nginx available.
  14. wxpython安装_Mac RobotFramework 安装
  15. SLAM--状态估计
  16. Android常用布局-01
  17. 投资学翻译2 Digesting Anomalies An Investment Approach
  18. 使用Machin公式计算
  19. 有趣的设计模式——从一杯奶茶品味装饰模式
  20. 【1024面试必备】厂长爆肝万字之多线程高并发JUC编程⭐建议收藏

热门文章

  1. jquery--拖拽效果
  2. Android opengles 实现触碰屏幕,根据运动轨迹画直线的功能
  3. 计算机空格键作用,电脑空格键有哪些作用?你知道几个?
  4. python射线法-离线根据经纬度反向获取城市信息
  5. 配置系统时钟(stm32)
  6. linux gprs 拨号上网,linux下用wvdial实现gprs拨号上网
  7. Mysql序号 查询
  8. Rabbit的字符串
  9. codeforces 645F Cowslip Collections
  10. 一种保留格式的加密算法FPE