MySQL的查询性能分析神器:explain命令的使用详解( 二 )


mysql> explain SELECT type, expire_date, id FROM test WHERE ul='11111' AND type=3 AND price BETWEEN 80 AND 80.999;+----+-------------+-------------------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+| 1 | SIMPLE | test| NULL | range | idx_id_type | idx_id_type | 778 | NULL | 1 | 100.00 | Using index condition |+----+-------------+-------------------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+1 row in set, 1 warning (0.00 sec)11.filtered:此查询条件所过滤的数据的百分比,表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例;越大表示存储引擎返回给server层的都是有用的,故说明效率较高,通常都是100%;
12.Extra:此处执行的额外信息,一次SQL查询的Extra可以包含以下的一条或多条,包括:

  • Using where:表示SQL语句存在WHERE条件,不是获取全表数据,一般使用了WHERE条件都会有这个;
  • Using index:表示使用覆盖索引返回数据,不需要访问表,通常是指该查询性能较好;
  • Using index condition:这个是在5.6版本后加入的新特性,主要作用是当WHERE中的某个条件对应的字段,如a,是加了索引的,但是无法使用,如使用了 a like ‘%abc%’ 这种SQL,在没有这个特性之前,存储引擎此时无法使用这个字段对应的索引了,需要回表找到符合WHERE其他条件的数据行,即full row正行数据,然后传给server层,最后在server层处理a like '%abc%'这个条件,即使a这个字段加了索引,这样就存储引擎就需要读取较多的数据行和传给server层较多的数据 。拥有这个特性之后,存储引擎层会使用索引来处理a like '%abc%'这个SQL,进一步过滤,从而减少回表查询的次数和传给server层的数据量;详见官方文档:8.2.1.5 Index Condition Pushdown Optimization
  • ,如下为详细例子:

MySQL的查询性能分析神器:explain命令的使用详解

文章插图
 
  •  
  • Using temporary:表示使用了临时表来进行分组、排序或者多表join,通常表示查询效率不高,需要优化;
  • Using filesort:表示需要使用一个外部文件索引来对结果进行排序,而不是直接根据内部索引顺序从表中读取数据,这个过程通常需要消耗比较大的CPU资源,需要优化 。
  •  

【MySQL的查询性能分析神器:explain命令的使用详解】


推荐阅读