range 范围扫描,表示在给定的范围内进行扫描,会使用到索引,性能较好。如:
explain select id,first_name from people where id < 3; 或 explain select id,first_name from people where last_name BETWEEN 'Allen' And 'Clinton';
ref 常规索引匹配扫描,表示用到的索引是常规索引(也叫普通索引),性能较好。需要注意的是,复合索引中的列顺序,要想使索引生效,需遵循最左前缀匹配法则。如:
explain select id,first_name from people where last_name='Allen' and first_name='Cuba';
eq_ref 索引关联扫描,联表查询时,如果关联的键是主键,就会出现这个值。性能较好。
const 常量引用扫描,表示用到的索引是主键或唯一索引,索引会等值匹配一个定值。性能最好。如:
explain select id,first_name from people where id=3; 5. possible_keys表示当前查询可能用到的索引,这个值不太重要。
6. key表示当前查询实际用到的索引。
7. key_len表示当前查询用到的索引的长度(字节数)。
8. ref表示索引的哪一列被用到了,如果是等值匹配索引,则是一个常数 const。
9. rows表示当前查询实际扫描的行数。值越小越好。这个参数非常重要。
10. Extra表示当前查询的额外信息,比如是根据什么方式排序的,获取数据的方式等。下面列举几个Extra参数常见的值:
using filesort 表示当前查询做了额外的步骤将结果集进行文件排序。如果看到这个值,就需要进行优化了。
using temporary 表示当前查询使用了一个临时表来存储结果。如果看到这个值,也需要进行优化。
using index 表示只使用索引就可以满足全部的查询需求,不需要再回表查询数据行,通常称之为索引覆盖查询。
通常,如果我们明确知道了哪条SQL查询语句效率很差,就可以用 explain 或 desc 来分析该SQL语句。但是,大多数情况下,我们并不知道是哪些SQL查询语句有问题,一般都是开启MySQL的慢查询日志,通过慢查询日志来确定查询效率较慢的问题SQL,然后再对这些问题SQL进行分析和优化。