一、执行计划的作用
执行计划是用于计算数据库优化器处理SQL的资源成本,在MySQL中使用执行计划的命令是explain(也可以写为desc、describe),通过该命令可以查看SQL在真正执行时所需要经历的一系列过程,通过执行结果可以看出SQL是通过索引查询还是遍历整个表等信息。执行计划命令所带的SQL并不会真正执行,所以不会担心占用系统资源,用于对SQL进行分析优化非常有用。如下示例:
mysql > EXPLAIN SELECT id,name FROM table; #explain后面接上SQL即可
二、explain执行计划返回结果
explain执行计划分为了多列,以下是各列的说明:
· id:SELECT语句的编号,如果存在子查询则编号递增,ID大的SQL会优先执行,ID相同的SQL为一组,同组中的SQL按从上往下的顺序执行。
· table:SQL所涉及到的表,一条SQL可能会涉及多张表,可以看这个分析具体是查哪张表有问题
· type:查询类型。按照执行效率从高到低为const(基于主键或者唯一索引查询,最多返回一条记录)、eq_ref(多表查询时是基于主键或非空唯一索引完成扫描、ref(基于普通索引等值查询,比如包含了=的语句)、range(基于索引范围查询,比如包含了>、<、like、in、between、and、or的语句)、index(全索引扫描)、all(全表扫描)。通常需要对ALL或者INDEX类型做优化。
· possible_keys:可能会被应用的索引,如果为空代表没有索引
· key:相比possible_keys,这列显示了SQL实际用到的索引
· key_len:索引长度,主要是对联合索引进行分析,越短越好,通常大于100需要优化
· ref:多表查询时表之间字段引用关系,显示索引哪一列被使用了
· rows:表扫描的行数
· filtered:存储引擎返回的数据在服务器层过滤之后剩下满足查询记录数的比例
· extra:扩展列,标记了查询过程的详细解释。如果出现以下两种情况代表需要优化SQL语句:Using filesort代表此查询使用到了文件排序,比如order by、group by语句,此类查询比较消耗CPU,建议建立联合索引;Using temporary说明用到了临时表来存储结果,这通常发生在对不同的列进行ORDER BY上,而不是GROUP BY上。
发表评论: