Mysql自带性能分析器Explain

北京中科助力白癜风康复 https://wapjbk.39.net/yiyuanfengcai/video_bjzkbdfyy/
大家好,我是小资。随着各种开源工具的出现,各种通用Mapper统统帮你把SQL语句封装的那叫个流畅。SQL语句基本上不再需要手写,项目中也就是需要多表联查的时候会手写下,但你知道你写的SQL或通用Mapper中的SQL语句执行效率高吗?有没有慢SQL的存在,那些语句能命中索引、哪些是在全表扫描。#MYSQL#

下面我就给大家介绍下Mysql自带性能分析器Explain,让它帮我们分析SQL,指导我们修改SQL语句、创建合适的索引,从而提高查询的效率。

介绍

Explain是Mysql自带的sql执行的性能分析器。通过explain命令获取select语句的执行计划。模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈。

Explain可以分析出表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用、每张表有多少行被优化器查询等等。

使用

Explain+SQL语句

使用就这个简单字段详解

id(了解)

表示查询的一个序列号,用来表示查询中执行select子句或操作表的顺序

相同时,查询的执行顺序为由上至下(如上图)

不同时,如果存在子查询,id的序号会递增,执行顺序由大到小(如下图)

id不同时

同时存在

相同和不同

select_type(了解)

查询的类型,用于区别普通查询、联合查询、子查询或其他的复杂查询。

SIMPLE简单的select查询,sql语句中没有使用UNION和子查询

PRIMARY查询中若包含任何复杂的子部分,最外层查询则被标记为Primary

DERIVED在FROM列表中包含的子查询,把结果放在临时表里。

SUBQUERY在SELECT或WHERE列表中包含了子查询

DEPEDENTSUBQUERY在SELECT或WHERE列表中包含了子查询,子查询基于外层

UNCACHEABLESUBQUERY无法使用缓存的子查询

UNION若第二个SELECT出现在UNION之后

UNIONRESULT从UNION表获取结果的SELECT

Table(了解)

数据的来源是那张表

Type(熟练掌握)

查询的访问类型。是较为重要的一个数据参数,该类型可以说直接反映你sql语句执行的快慢。结果值从最高到最低依次为:

systemconsteq_refreffulltextref_or_nullindex_mergeunique_subqueryindex_subqueryrangeindexall

常见的类型

Systemconsteq_refrefrangeindexall

我们平时sql调优的时候,一般得保证查询至少达到range级别,最好能达到ref。

System:只有一行记录,这是const类型的特列,开发中可以说不会出现。

Const:通过一次索引就找到,const用于比较primarykey或者unique索引。因为只匹配一行数据,所以将主键放到where后查询,MySQL就能将该查询转换为一个常量。

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

Ref:非唯一性索引扫描,返回匹配某个单独值的所有行。

Range:检索定范围的行,使用一个索引来选择行。一般当你使用where语句中出现了between、、、in等的查询是出现

Index:sql使用了索引但是没用通过索引进行过滤,一般是使用了覆盖索引或者是利用索引进行了排序分组。

All:全表扫描,遍历全表来找到匹配的行。

possible_keys

在这张表中肯能使用到的索引,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

Key

真实使用的索引。如果为NULL,表示没有使用索引。

key_len

索引中使用的字节数。key_len字段能够帮你检查是否充分的利用上了索引。ken_len越长,说明索引使用得越充分。

ref

表示索引的那一列被使用了,如果可以的话,最好是一个常量。表示那些列或者常量被用于查找列上的值。

rows

rows列显示MySQL认为它执行查询时必须检查的行数。越少越好!

Extra(重要指标)

其他的额外重要的信息。

Usingfilesort(降低性能)MySQL中无法利用索引完成的排序操作称为“文件排序”。

Usingtemporary(降低性能)使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序orderby和分组查询groupby。

Usingindex(提高性能)Usingindex代表表示相应的select操作中使用了覆盖索引(CoveringIndex),避免访问了表的数据行,效率不错!如果同时出现usingwhere,表明索引被用来执行索引键值的查找;如果没有同时出现usingwhere,表明索引只是用来读取数据而非利用索引执行查找。利用索引进行了排序或分组。

Usingwhere表明使用了where过滤。

Usingjoinbuffer使用了连接缓存

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

结束语

以上则为Explain的具体使用和每个字段表示的含义。

如果大家觉得文章内容不错,快去分享给更多小伙伴吧。

创作不易,感谢大家的支持,多多


转载请注明:http://www.aierlanlan.com/rzdk/8368.html

  • 上一篇文章:
  •   
  • 下一篇文章: