一条SQL的执行计划自我描述

[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
大数据代码案例地址: https://github.com/Mydreamandreality/sparkResearch


  • 日常的开发中,我们需要用慢查询来记录一些执行时间比较久的SQL。(慢查询记录可以查看我之前的文章)

  • 获取到执行慢的SQL后,我们就可以进行性能分析优化了

  • 一般都是通过explain这个命令来获取当前SQL的执行计划

  • 看一下SQL索引有没有命中,有没有进行全表扫描的操作,查询方式是什么等等

  • expain出来的信息有12列,分别是id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、fitered、Extra

MySQL.Expain指标参数分析

ID

  • 如果有子查询的情况,id序号值越大优先级越高,先执行

select_type

  • SIMPLE(简单SELECT,不使用UNION或子查询等)
  • PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
  • UNION(UNION中的第二个或后面的SELECT语句)
  • DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
  • UNION RESULT(UNION的结果)
  • SUBQUERY(子查询中的第一个SELECT)
  • DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)
  • DERIVED(派生表的SELECT, FROM子句的子查询)
  • UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

table

  • 当前行的数据属于哪一张表

type

  • MySQL在表中找到该数据的方法,又称访问类型
  • 常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
  • ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
  • index: Full Index Scan,index与ALL区别为index类型只遍历索引树
  • range:只检索给定范围的行,使用一个索引来选择行
  • ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  • eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
  • const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
  • NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

paritions

  • 待补充

possible_keys

  • 指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
  • 该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
    如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

key

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

key_len

  • 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
  • 不损失精确性的情况下,长度越短越好

ref

  • 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows

  • 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

fitered

  • 待补充

extra

  • 该列包含MySQL解决查询的详细信息,有以下几种情况:
  • Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
  • Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
  • Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
  • Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能
  • Impossible where:这个值强调了where语句会导致没有符合条件的行。
  • Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

总结

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

MySQL调优系列:explain分析SQL的执行计划相关推荐

  1. MySQL——通过EXPLAIN分析SQL的执行计划

    在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序. 下面分别对EXPLAIN命令结果的每一列进行说明: ...

  2. mysql查看执行计划_MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...

  3. explain如何查看mysql_MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...

  4. MySQL调优系列基础篇

    前言 有一段时间没有写博客了,整天都在忙,上班,录制课程,恰巧最近一段时间比较清闲,打算弄弄MYSQL数据库. 关于MySQL数据库,这里就不做过多的介绍,开源.免费等特性深受各个互联网行业喜爱,尤其 ...

  5. mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率

    MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...

  6. mybatis与mysql调优_MySQL + mybatis的SQL优化方案

    sql优化方案: 1.添加索引,在条件参数,关联参数上建立参数, 2.字段优化,需要什么字段查什么字段 3.模糊查询尽量使用: select * from tableName a where a.na ...

  7. 在 MySQL 中使用 explain 查询 SQL 的执行计划(转自: 数据分析与开发)

    **来源:Oo若离oO my.oschina.net/ruoli/blog/1807394** 1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有 ...

  8. 在MySQL中使用explain查询SQL的执行计划

    1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...

  9. MySQL调优系列:如何正确的使用MySQL索引

    MySQL索引使用详解,原理分析 [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 大数据代码案例地址: https://githu ...

最新文章

  1. 阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能
  2. 数据结构 - 反转单链表(C++)
  3. 自学python的书-推荐6本学习Python的免费电子书
  4. sqlserver使用存储过程发送http请求
  5. [MATLAB粒子模拟]Energy Vx(X) Vy(X) Vz(X)
  6. 无法加载登录用户界面DLL MyGina.dll 解决
  7. 数学之路-分布式计算-disco(4)
  8. 对象存储,为什么那么火?
  9. Intellij IDEA15:建立Scala的Maven项目
  10. OllyDbg笔记-修改Messagebox的标题
  11. Hibernate POJO在序列化(JSON)时遇到的若干问题
  12. 修改linux终端的提示字符
  13. 共享的网络如何让自己比别人快_OPPO K3如何共享网络?
  14. android长按非控件处,Android常用之Butterknife使用详解
  15. RabbitMQ 中的 7 种队列模式,写得太好了!
  16. [Campus]我的大学
  17. 巴比特 | 元宇宙每日必读:红杉中国“雇”了一位虚拟员工,自称每秒可看百份商业计划书,期待时薪为0.68元...
  18. 你必须知道的指针基础-6.内存的初始化及结构体的使用
  19. 高效工程师系列(一) 如何找到一个利于自己成长的环境
  20. fzyczn生日赛t1 CZN

热门文章

  1. oracle SQL认证考试,sql认证(sql server认证考试)
  2. Android图片打水印
  3. 【JD1-100漏电继电器】
  4. java根据出生日期自动计算年龄(工具类)
  5. Solution:设备管理器中Prolific USB-to-Serial Port出现黄色感叹号
  6. 年底了,程序员如何谈加薪?
  7. 管理信息系统【七】之 系统实施与评价
  8. 史上最全的StarUML使用教程
  9. 【51单片机】室友用一把王者时间,学会了去使用数码管。
  10. 实验管理系统springboot+vue+element ui项目开发