explain
解释:mysql关键字之一,用于解释某条sql的执行效率
用法:explain select id,name from table where id=1;
基本属性:id,select_type , table , type , possible_keys , key , key_len , ref , rows , extra
(explain查出的条数就是你select语句关联表的个数,不包括系统创建的临时表)
explain属性 , 属性值解释
一、id
id的值表示执行的顺序,值越大,优先级越大,值相同,从上到下执行
二、 select_type
1.SIMPLE 表示单表查询
2.PRIMARY 表示有复杂查询(多表,子查询,union),最外层的查询
3.DERIVED:导出表的SELECT(FROM子句的子查询)
4.UNION 有union关联表,UNION中的第二个或后面的SELECT语句
5.UNION RESULT 使用union查询结果的临时表
6.DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
7.SUBQUERY:子查询中的第一个SELECT
8.DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
9.DEPENDENT SUBQUERY 表示为子查询
三、table
select语句的表对象(表面,别名,临时表名称)
四、type(重点关注)
所有值对象(效率从好到坏)
system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL
1.const 表示在查询条件中的字段有索引(索引是UNIQUE或PRIMARY KEY)
2.eq_ref 两个表关联,关联条件为两个表的唯一索引(索引是UNIQUE或PRIMARY KEY)
3.ref 对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取
4.ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行
5.index_merge:该联接类型表示使用了索引合并优化方法。
6.unique_subquery 子查询的结果是唯一
7.index_subquery 子查询的结果带索引
8.range 查询的条件在某个范围内
9.index 读全表,查询字段涉及索引
10.ALL 读全表,查询字段不涉及索引
五、possible_keys
指出在select语句中,有助于查询用到的索引
六、key(重点关注)
在select查询时,用到的真正的索引
七、key_len
key的长度
八、ref
值:const(表示常量),列名
表示select使用哪一列或者哪一常量在查询中
九、rows(关注)
表示mysql执行查询的行数,数值越大效率越差
十、Extra(关注)
1. Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
2. Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
3. range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
4. Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。返回结果集之前进行了外部排序,及文件排序。效率差
5. Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。查询所需的数据可以直接从索引树中检索到。效率好
6. Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。效率差
7. Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
8. Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
9. Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
注意:还需要注意rows的数值,多行之间的数值是乘积的关系,可以估算大概要处理的行数,如果乘积很大,那就很有优化的必要了。