Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一次浴火重生的MySQL优化(EXPLAIN命令详解)

一次浴火重生的MySQL优化(EXPLAIN命令详解)

作者头像
赵小忠
发布于 2018-01-24 11:33:44
发布于 2018-01-24 11:33:44
1K0
举报
文章被收录于专栏:禁心尽力禁心尽力

一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*去检索表、给常常使用的列建立索引、还有创建表的时候注意选择更优的数据类型去存储数据等等,我只能说那些都是常识,作为开发人员是必须要知道的。但真正的优化并不是使用那些简单的手法去完成实现的,要想知道一条SQL语句执行效率低的原因,我们可以借助MySQL的一大神器---"EXPLAIN命令",EXPLAIN命令是查询性能优化不可缺少的一部分,本文在结合实例的同时会总结explain命令的使用及相关参数的说明。

       首先说说我这次浴火重生的优化初衷吧,上个月在公司完成的统计模块中,其中就有几条SQL语句执行的速度稍微有点慢,心里一直留了一道坎。直到昨天晚上在家看了一篇文章,是关于MySQL优化的对EXPLAIN命令的详解,所以今天一到公司就想着把之前那些SQL语句的病赶紧给看看,虽然,我没有达到那种秒查的效果,但是优化的效果还是有明显的提升。

业务场景:

分区统计XXX省每月上传数据的企业数量,何为企业是否是未上传数据,即专门存放上传数据的数据表中没有记录的为未上传数据的企业,如果有那么代表已经上传数据。

下面是我之前写的SQL语句(未优化前的),它执行的时间是2.318sec,并且使用EXPLAIN命令进行分析:

首先说说EXPLAIN命令查询后打印的数据列它们各个列代表的意思:

  1、id :该列的值是用来顺序标识整个查询中SELELCT 语句的执行顺序,在嵌套查询中id越大的语句越先执行,该值可能为NULL。个人建议,可以在分析一条很长的SQL语句时可以依照它的值来按顺序进行切割分析优化。

  2、select_type :表示当前select查询的类型,该列可能出现的值还有如下情况;

3、table :对应行正在访问哪一个表,表名或者别名(注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的);

  • 关联优化器会为查询选择关联顺序,左侧深度优先
  • 当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列
  • 当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id

  4、type :该列的值代表的含义是访问数据表的检索类型,也是最为重要的优化指标之一,它的好坏情况依次是  system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref级别,下面是各个值代表的意思。个人建议:可以在分析一条很长的SQL语句时,尽量让每个拆分的检索子句都到理想的优化级别;

5、possible_keys :显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的,也就是说该索引在查找的时候未必真正的使用上。

  6、key :该列表示在检索时实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

  7、key_len :该列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

  8、ref :该列表示使用哪个列或常数与key一起从表中选择行,个人翻译:就是当前检索中的语句与哪个表中的列联合查找数据的。

  9、rows :该列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。个人建议:该值如果比整表总记录数越低,则越好。

  10、Extra :该列的值是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。我们通常根据该列的值来判断SQL语句是否需要优化;

根据上面的知识分析:

我通过MySQL EXPLAIN分析的思路是这样的:通常首先要根据id的值确定当前检索语句是何时执行的,注意分析的时候按顺序分析,其次在根据type列的值来判断当前检索语句是否需要优化,最后看决定性的一点就是根据Extra的值,上面表格中也说了,如果看到Using temporary一般就需要优化了。

       因为我上面的那条语句是一个子查询,所以我首先根据id的值找到最先执行的检索语句,也就是嵌套在最内层的那条等值查询语句,它分别使用等值条件去连接企业表和上传数据表筛选出符合条件的数据,但是使用EXPLAIN命令分析得出,这条检索语句并不是真正的高效,在扫描org表的时候进行了全表数据连接而不是有条件的去刷选连接,而且在等值连接的时候并未真正使用主键索引去等值连接,再回过头来仔细想想我们的业务,就是拿着info表中的数据去org表中进行匹配,当然全表扫描info是避免不了的,但是org表不一定全部都扫描啊,所以我试着用左连接替代之前的等值连接,果然效果达到了,info表进行了全表数据匹配去连接org表中的数据,并且在匹配的时候org表的主键索引也真正使用到了,级别达到了eq_ref,至于info表的ALL级别,毋庸置疑业务需要必须就是要去扫描整表的;最后看到最外层的检索语句也未必是高效的,它关联的地区表也进行了全表数据匹配,但是我要的查询结果是根据子查询结果来得出的,肯定不比子查询结果的数据多,所以我将子查询结果作为左表去匹配地区表中的数据,果然,由ALL级别变成range级别,检查的行数也由3646减少到了15,经过分析优化执行速度提升1秒多,优化级别基本达到理想的状态,由于本人能力有限,只能做到这步:

以上都是本人经过实践得出,并非乱写,如果有地方总结不到位,希望各位留言补正,共同学习,共同进步,一直在优化的路上。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴。
程序员小富
2020/05/20
8630
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
这个MySQL优化原理剖析,比照X光还清楚
| 作者 沈启超,19年硕士毕业于东南大学,目前在腾讯CSIG企业产品部担任后台开发,同时也参与公司内部存储开源组件MySync的开发。 ---- 前言:MySQL架构体系 首先分享实验前的基础知识,MySQL主要分为Server层与存储引擎层。 Server层主要包含连接器、检索内存、分析器、优化器、执行器等,所有跨存储引擎的功能均于这一层构建,例如存储过程、触发器、视图,函数等,有一个标准化的binglog日志模块。 存储引擎负责数据的存储与存取,使用可更换的插件式架构,拥有InnoDB、MyISA
腾讯云数据库 TencentDB
2020/09/25
7480
搞懂 MySQL Explain 命令之前不要说自己会SQL优化
MySQL explain 命令是查询性能优化不可缺少的一部分,该文主要讲解 explain 命令的使用及相关参数说明。
Guide哥
2020/12/11
9990
搞懂 MySQL Explain 命令之前不要说自己会SQL优化
简单了解SQL性能优化工具MySql Explain
MySql Explain是对SQL进行性能优化不可或缺的工具,通过他我们可以对SQL进行一定的分析和性能优化,降低线上业务因慢查询造成的性能损失。
春哥大魔王
2020/01/02
1.6K0
MySQL EXPLAIN详解
MySQL数据库是许多Web应用程序的底层支持,而查询性能的优化是确保系统高效运行的关键。在MySQL中,EXPLAIN是一项强大的工具,可帮助开发者深入了解查询语句的执行计划,从而更好地优化查询性能。本文将详细解析MySQL的EXPLAIN关键字,以揭开查询执行计划的面纱。
修己xj
2023/12/06
4990
MySQL EXPLAIN详解
这次是真拯救了我,MySQL索引优化,explain讲得非常清楚了
这篇文章主要讲 explain 如何使用,还有 explain 各种参数概念,之后会讲优化
Java程序猿阿谷
2020/07/28
7870
这次是真拯救了我,MySQL索引优化,explain讲得非常清楚了
【MySQL】MySQL Explain性能调优详解
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
终有救赎
2023/12/14
2940
【MySQL】MySQL Explain性能调优详解
【mysql系列】细谈“explain”之理论Part
我们先了解一下explain语法和相关理论知识。 语法: EXPLAIN SELECT select_options;
沁溪源
2020/10/28
5570
【mysql系列】细谈“explain”之理论Part
MySQL优化思路及框架
MySQL优化框架 1. SQL语句优化 2. 索引优化 3. 数据库结构优化 4. InnoDB表优化 5. MyISAM表优化 6. Memory表优化 7. 理解查询执行计划 8. 缓冲和缓存
若与
2018/04/25
1.1K0
MySQL优化思路及框架
mysql查询优化explain命令详解
mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索
Java技术栈
2018/03/29
1.3K0
【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
“你一定又写了烂SQL了!”,“你怎么这样凭空污人清白……慢查询,慢查询不能算烂……慢查询!……程序猿的事,能算烂么?” 本文从SQL执行效率方面略作研究,偏向基础性总结,但力求详实准确。如果有大佬误入此地,还请从容撤退,如果你真的愿意看,我也没什么意见。
云深i不知处
2020/09/16
1.4K0
Mysql explain命令详解
在 MySQL 中,EXPLAIN 语句用于获取关于查询执行计划的信息,模拟优化器执行SQL查询语句,帮助我们分析SQL查询的瓶颈。
一杯茶Ja
2024/09/25
3170
MySQL优化之Explain命令解读
  explain为MySQL提供语句的执行计划信息。可以应用在select、delete、insert、update和place语句上。explain的执行计划,只是作为语句执行过程的一个参考,实际执行的过程不一定和计划完全一致,但是执行计划中透露出的讯息却可以帮助选择更好的索引和写出更优化的查询语句。
星哥玩云
2022/08/17
8920
SQL优化中新建索引真的比Explain好?面试官:你出去吧
前几天老大问我怎么进行sql优化的,我回答了新建索引。哈哈哈,然后老大就出去找棍子了,进来之后跟我说你知道门在哪边吧,自己出去还是我请你出去?
Java程序猿阿谷
2021/01/04
5400
SQL优化中新建索引真的比Explain好?面试官:你出去吧
Mysql Explain 详解
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。(QEP:sql生成一个执行计划query Execution plan)
幽鸿
2020/04/02
1.1K0
【mysql系列】细谈explain执行计划之“谜”
我们先了解一下explain语法和相关理论知识。 语法: EXPLAIN SELECT select_options;
沁溪源
2020/10/28
9580
【mysql系列】细谈explain执行计划之“谜”
MySQL进阶笔记-3(MySQL优化)
在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的 SQL 语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化,本章将详细介绍在 MySQL 中优化 SQL 语句的方法。
千羽
2021/01/14
4770
MySQL进阶笔记-3(MySQL优化)
mysql explain ref const_MySQL EXPLAIN 详解「建议收藏」
EXPLAIN 命令用于SQL语句的查询执行计划。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。
全栈程序员站长
2022/11/02
1.1K0
Mysql优化-索引
单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上; 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引);
码客说
2019/10/21
1.4K0
explain的属性详解与提速百倍的优化示例
在MySQL中,可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。
全菜工程师小辉
2019/08/21
1.4K0
explain的属性详解与提速百倍的优化示例
相关推荐
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档