MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令的使用及相关参数说明。

EXPLAIN Output Columns

列名说明id执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置

select_type显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)

table访问引用哪个表(引用某个查询,如“derived3”)

type数据访问/读取操作类型(ALL、index、range、ref、eq_ref、const/system、NULL)

possible_keys揭示哪一些索引可能有利于高效的查找

key显示mysql决定采用哪个索引来优化查询

key_len显示mysql在索引里使用的字节数

ref显示了之前的表在key列记录的索引中查找值所用的列或常量

rows为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值相乘,可粗略估算整个查询会检查的行数

Extra额外信息,如using index、filesort等

id

id是用来顺序标识整个查询中SELELCT 语句的,在嵌套查询中id越大的语句越先执行。该值可能为NULL,如果这一行用来说明的是其他行的联合结果。

select_type

表示查询的类型

类型说明simple简单子查询,不包含子查询和union

primary包含union或者子查询,最外层的部分标记为primary

subquery一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询

derived派生表——该临时表是从子查询派生出来的,位于form中的子查询

union位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived

union result用来从匿名临时表里检索结果的select被标记为union result

dependent union顾名思义,首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询

subquery子查询中第一个SELECT语句

dependent subquery和DEPENDENT UNION相对UNION一样

table

对应行正在访问哪一个表,表名或者别名关联优化器会为查询选择关联顺序,左侧深度优先

当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列

当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id

注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

type

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。

类型说明All最坏的情况,全表扫描

index和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多

range范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range

ref一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同的是,它用在关联操作只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的带索引的列。

eq_ref最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效)

const当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)

system这是const连接类型的一种特例,表仅有一行满足条件。

Null意味说mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效)

possible_keys

显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的

key

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

key_len

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

ref

ref列显示使用哪个列或常数与key一起从表中选择行。

rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。

Extra

Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

类型说明Using filesortMySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。

Using temporary用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。

Not existsMYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。

Using index说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录。

Using index condition这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。

Using where使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用WHERE条件过滤。

Using join buffer使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接

impossible wherewhere子句的值总是false,不能用来获取任何元组

select tables optimized away在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

distinct优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

作者:高广超

链接:https://www.jianshu.com/p/ea3fc71fdc45

來源:简书

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

mysql中%3cwhere%3e_MySQL EXPLAIN详解相关推荐

  1. 【MySQL附录】A4:MySQL中执行计划explain详解

    MySql使用explain关键字可以模拟优化器执行sql语句,我们就能够知道MySql会如何处理咱们的sql, 可以根据explain的分析结果和MySql底层数据结构优化sql.文章内容基于MyS ...

  2. mysql中数据库字段类型详解

    mysql中数据库字段类型详解 1,blob字段 mysql中blob是一个二进制大型对象,是一个可以储存大量数据的容器,它能容纳不同大小的数据. mysql中blob的四种类型除了存储数据的大小有区 ...

  3. mysql中 where in 用法详解

    https://blog.csdn.net/haibo0668/article/details/52584307 sssss mysql中 where in 用法详解 我是高手高手高高手 2016-0 ...

  4. mysql中整数数据类型tinyint详解

    文章来源: 学习通http://www.bdgxy.com/ 目录 1.1tinyint类型说明 1.2实践环境说明 1.3加unsigned属性 1.3.1SQL模式开启严格模式 1.3.2SQL模 ...

  5. Mysql 性能优化神器Explain详解

    文章目录 Explain的作用 博文背景 Explain 使用方法 Explain之ID说明 1. ID值相同 2.ID值不同 3.ID值相同,ID值不同共存 Explain的select_type详 ...

  6. mysql中 signed 与 unsigned  详解

    mysql中 有符号(signed), 无符号(unsigned )与 零填充(zerofill) 详解 三者区别 unsigned 是mysql自定义的类型,表示无符号数值即非负数.signed为整 ...

  7. MySQL中Case When用法详解

    最近,在学习Hive基础知识时,遇到了遇到了Case When Else End语法,以前学习MySQL时忽略了这部分知识点,现总结一下相关的知识给大家.首先练习一个例子如下: 一.学生课程成绩统计 ...

  8. Mysql之查询优化器 EXPLAIN 详解

    了解查询优化器 查询瓶颈 CPU饱和(读取数据至内存 or 将数据持久化至硬盘) IO饱和(读取数据远大于内存容量) 硬件制约(top,free,iostat,vmstat等系统性能状态) 执行计划( ...

  9. mysql中的describe语法详解

    在MySQL中,DESCRIBE 和 EXPLAIN 是同义词.可以使用两者中的任何一个来获取表结构信息或者查询执行计划(查询执行计划:对MySQL执行查询的解释) 事实上,尽管说二者是同义词.但是, ...

最新文章

  1. [Github]watch和star的区别
  2. mysql not in语句_MySQL命令
  3. linux 文件系统覆盖目录,Linux内核裁减及根文件系统定制
  4. CNN-2: AlexNet 卷积神经网络模型
  5. 【消息队列MQ】各类MQ比较
  6. 特斯拉第四季度生产超30.5万台车 全年交付近百万台
  7. Python获取Redis所有Key以及内容
  8. 计算机二级系统环境,计算机等级二级Java考试辅导:“系统和环境”单元综合复习...
  9. mybatis源码:mybatis的sql解析
  10. Python学习笔记——python基础之python中for......else......的使用
  11. 大数据收集系统架构图
  12. 实验二 概念模型ER图
  13. MarkDown在VSCode环境下使用
  14. 天啦噜!原来Android属性动画也不过如此
  15. js颜色加深或者减淡
  16. centos oracle libaio哪下载,在CentOS4.5上安装Oracle10g出现的libaio-0.3.96; found Not found问题求救...
  17. IE、360、百度三者的比较
  18. 递归与回溯4:一文彻底理解回溯
  19. 番茄编程助手_如何使用番茄法高效的写算法题?
  20. python课程表代码_Python课程表

热门文章

  1. 2020年博士研究生报考指南「指南+复习真题」
  2. TDW开源:腾讯的分布式数据仓库
  3. 路由器和交换机工作原理
  4. 怎么切换界面_PLC外部开关如何控制触摸屏界面的切换?
  5. linux排查进程退出原因面试,linux面试中经常会遇到的问题
  6. 1.Pytorch3d教程——介绍
  7. visio中将图片改为平行四边形_visio中怎么画平行四边形并图色呢?
  8. JavaMail简单实践
  9. H5禁止ios回弹效果
  10. DSPF28335-CMD文件说明