Mysql语句 explain命令性能分析
在工作中,我们需要对select语句进行优化,以便节约资源与性能,提升查询速度。但是,我们应该怎么查询一个sql语句的性能呢?这里记录一种mysql自带的性能查询命令:EXPLAIN。
博客主要参照:https://www.cnblogs.com/gomysql/p/3720123.html 的命令详解
一般情况下使用explain命令格式为:explain select … from … [where …]
这条命令会返回以下基本结果:当然复杂的语句会返回更多的字段。
网络上关于这些字段的描述有很多,但是我关心的只有几个重要的字段:
1. type: 这列最重要,显示了连接使用了哪种类别,是使用Explain命令分析性能瓶颈的关键项之一。
结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
1)ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
2)index:Full Index Scan,index与ALL区别为index类型只遍历索引树
3)range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。显而易见的索引范围扫描是带有between或者where子句里带有<, >查询。当mysql使用索引去查找一系列值时,例如IN()和OR列表,也会显示range(范围扫描),当然性能上面是有差异的。
4)ref:使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行
5)eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
6)const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量
7)NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
2. possible_keys:列指出MySQL能使用哪个索引在该表中找到行。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
3. key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
4. key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度,显示的值为索引字段的最大可能长度,并非实际使用长度。
5. ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
6. rows:显示MySQL认为它执行查询时必须检查的行数。
7. Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。
1)Using index:该值表示相应的select操作中使用了覆盖索引(Covering Index)
2)Using where:表示mysql服务器将在存储引擎检索行后再进行过滤。许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where字句的查询都会显示"Using where"。有时"Using where"的出现就是一个暗示:查询可受益与不同的索引。使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题。
3)Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,看到这个的时候,查询需要优化了。。这个值表示使用了内部临时(基于内存的)表。一个查询可能用到多个临时表。有很多原因都会导致MySQL在执行查询期间创建临时表。两个常见的原因是在来自不同表的上使用了DISTINCT,或者使用了不同的ORDER BY和GROUP BY列。
4)Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”。
5)Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能