我们在检查SQL的执行效率时,通常使用"EXPLAIN"来查看执行计划。
输出内容都代表什么呢?
1.id:表示查询中select操作表的顺序,按顺序从大到依次执行。
2.select_type:
SIMPLE:简单查询(不使用关联查询或子查询)
PRIMARY:如果包含关联查询或子查询,则最外层的查询部分标记为primary
UNION:联合查询中第二个及后面的查询
DEPEDENT UNION:满足依赖外部的关联查询中第二个及以后的查询
UNION RESULT:联合查询的结果
SUBQUERY:子查询中的第一个查询
DEPEDENT SUBQUERY:子查询中的第一个查询,并且依赖外部查询
DERIVED:用到派生表的查询
MATERIALIZED:被物化的子查询
UNCACHEABLE SUBQUERY:一个子查询的结果不能被缓存,必须重新评估外层查询的每一行
UNCACHEABLE UNION:关联查询第二个或后面的语句属于不可缓存的子查询
3.table : 表示该语句查询的表。
4.type :该属性表示访问类型。
type的好坏顺序:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,得保证查询至少达到range级别,最好能达到ref,type出现index和all时,表示走的是全表扫描没有走索引,效率低下,这时需要对sql进行调优。
system:查询对象表只有一行数据,且只能用于MYISAM和Memary引擎的表,这是最好的情况
const:基于主键或唯一索引查询,最多返回一条结果
eq_ref:表连接时基于主键或非null的唯一索引完成扫描
ref:基于普通索引的等值查询,最多返回一条结果
fulltext:全文检索
ref_or_null:表连接类型时ref,但进行扫描的索引列中可能包含null值
index_merge:利用多个索引
index_subquery:子查询中使用唯一索引
range:利用索引进行范围搜索
index:全索引扫描
all:全表扫描
5.possible_keys :可能走的索引。
6.key :实际使用的索引。
7.key_len : 索引所使用的字节数。
8.ref : 连接匹配条件,如果走主键索引的话,该值为: const。全表扫描的话,为null值。
9.rows : 扫描行数。(通常情况下,rows越小,效率越高)
10.Extra :该属性中包括执行SQL时的真实情况信息。using where:表示使用where筛选得到的值。Using temporary:使用临时表。using filesort:使用文件排序。当Extra 出现Using filesort或Using temproary时,表示无法使用索引,必须尽快做优化。