用STRAIGHT_JOIN优化mysql的执行速度
优化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的执行速度相关推荐
- 数据库-优化-MYSQL的执行顺序
MySQL的执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只 ...
- 优化SQL的执行速度
2019独角兽企业重金招聘Python工程师标准>>> 在项目开发中,页面的反应速度是非常重要的,改善页面反应速度的方法有很多. 但一般的问题多数是出现在数据库访问的SQL上面. 比 ...
- 第1章计算机系统概述__计算机系统性能评价之2_用执行速度进行性能评估
最早用来衡量计算机性能的速度指标是每秒钟完成单个运算(如加法) 指令的条数. 指令速度所用的计量单位为MIPS (Million Instructions Per Second) ,其含义是平增多每秒 ...
- Mysql中查询速度的优化
2019独角兽企业重金招聘Python工程师标准>>> mysql中查询速度的优化 1.查看每一个表的数据量 2.left join的时候尽量减少表的大小,通过临时表,查询条件去限制 ...
- mysql 查询执行计划_mysql8 参考手册--了解查询执行计划,使用EXPLAIN优化查询
根据表,列,索引的详细信息以及WHERE子句中的条件,MySQL优化器考虑了许多技术来有效执行SQL查询中涉及的查找.无需读取所有行即可执行对巨大表的查询:可以执行涉及多个表的联接,而无需比较行的每个 ...
- MySQL 内部执行优化策略总结
MySQL 内部执行优化策略总结 前言 一.查询优化策略 1. ICP 索引条件下推 2. MRR 多范围读取优化(批量回表) 3. 索引合并 (1) Intersection 合并 (2) Unio ...
- iar代码优化影响运行速度吗_IAR中优化等级对Kinetis FGPIO执行速度的影响
在灯光控制.IO模拟Flex Bus等很多应用中,对GPIO的翻转速度有很高的要求,M0+内核中集成了一个特定的single-cycle I/O port,Kinetis中我们称之为Fast GPIO ...
- mysql无序id怎么优化limit_MYSQL分页limit速度太慢优化方法
原标题:MYSQL分页limit速度太慢优化方法 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一 ...
- Mysql的执行顺序与优化分析
编写顺序与执行顺序分析 一条完整的sql语句编写流程应该如下: select distinct 查询字段 from 表名 JOIN 表名 ON 连接条件 where 查询条件 gr ...
最新文章
- gltf与glb格式转换 gltf-pipeline、binary-gltf-utils
- SAP RETAIL 特征参数文件(Characteristic Profile) II
- JAVA_OPTS 参数
- 使用Axure制作无限循环展示图片效果
- Python入门100题 | 第018题
- js 校验验证码 知识点
- 在一个电子商务网站应用中,涉及的实体信息类有很多,比如用户类User和用户地址类Address; 而每一个实体类的对象信息要存储到相应的数据库表中,如userTable和addressTable。
- 经典汉诺塔(Java初学递归篇)
- [HAOI2016]食物链
- mysql_根据身份证号识别性别、年龄、所在省份
- 一:ActiveMQ知识整理
- jdbc连接oracle查询数据库,JDBC连接Oracle数据库,并操作数据库,查询表
- No package nginx available.
- wxpython安装_Mac RobotFramework 安装
- SLAM--状态估计
- Android常用布局-01
- 投资学翻译2 Digesting Anomalies An Investment Approach
- 使用Machin公式计算
- 有趣的设计模式——从一杯奶茶品味装饰模式
- 【1024面试必备】厂长爆肝万字之多线程高并发JUC编程⭐建议收藏