大家好,我是小资。随着各种开源工具的出现,各种通用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的具体使用和每个字段表示的含义。
如果大家觉得文章内容不错,快去分享给更多小伙伴吧。
创作不易,感谢大家的支持,多多