explain

1.explain用来查看当前sql的执行计划,分析sql的执行效率

2.explain各字段解释:

①.id: 表示查询中执行select子句或者操作表的顺序

  >.id相同,顺序由上而下
  >.id不同,如果是子查询。id序号会递增,序号越大,优先级越高,越先被执行
  >.id相同,可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先被执行

②.select_type:查询类型,用于区别 普通查询、联合查询、子查询等

  >.simple: 简单的select查询,查询中不包含子查询或者union

    >.primary: 查询中包含任何复杂的子部分,最外层的会被标记为primary
    >.subquery: 在select或者where列表中包含子查询
    >.derived: 在from列表中包含了子查询,被标记为derived(衍生),mysql会递归查询这些子查询,把结果放在临时表中
    >.union: 如果第二个select出现在union之后,就别标记为union,如果union包含在from字句的子查询中,外层select被标记为derived
    >.union result: 从union表中获取结果的select
③.table:表示执行的sql属于哪张表
④.type: 访问类型排列 
  all:全表扫描
  index: full index scan  全索引扫描
  range: 只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪些索引;一般就是在where中出现了between或者 < > in等
  ref: 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,会返回匹配某个值的所有行
  eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见主键或者唯一索引扫描
  const: 表示通过索引一次就找到了,const用于比较primary_key和union,由于只匹配一条数据,所以很快,
  system: 表中只有一条记录(等于系统表),这是const类型的特例,生产上不常见
 
  从最好到最差的顺序 system > const > eq_ref > ref > range > index > all       
  一般而言,最少要的range或者ref级别
 
⑤.possible_keys:显示可能使用到的索引,但是不一定被使用
⑥.key:实际使用的索引,如果为null。则表示要么没有建索引,要么建索引了 但是没有使用;如果使用了覆盖索引,则该索引只出现在key中
⑦.key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度,长度越短越好
⑧.ref:显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
  如果使用的是常数来作为查询条件,显示的是const
  如果是连接查询,会显示具体的字段。数据库.表.字段
  
⑨.row:根据表统计信息以及索引选用情况,大致估算出找到所需的记录所需要读取的行数,该值越小越好
⑩.Extra:不适合显示在其他字段但十分重要的额外信息(一个字段,可能会对应多个值)
   using filesort(文件内排序):说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。mysql中无法使用索引完成的排序操作叫做 文件排序;出现这个,比较危险
   using temporary:使用了临时表保存中间的结果,mysql在对查询结果排序时使用了临时表,常见于order by排序和分组查询group by;
   using index:表示select操作使用了覆盖索引,避免了访问表的数据行,效果不错;
                      如果同时使用using where,表示索引被用来执行索引键值的查找;
                      如果没有同时出现using  表明索引被用来读取数据,并没有执行查找动作
posted @ 2019-06-13 18:51  小小少年-  阅读(680)  评论(0编辑  收藏  举报