id

id相同,执行顺序从上之下 id不同,执行顺序从大到小 id相同不同,同时存在,遵守1、2规则

可以这样理解,执行顺序从大到小,先执行id为2的,然后执行id为1的(先A再B,规则1);执行顺序为:第三行,第一行,第二行

select_type

查询中每个select的查询类型,如下:

  1. SIMPLE:简单select,不使用union和子查询
  2. PRIMARY:查询中包含任何复杂的子部分,最外层的select被标记为PRIMARY
  3. UNION:union中第二个后面的select语句
  4. DEPENDENT UNION:一般是子查询中的第二个select语句(取决于外查询,mysql内部也有些优化)
  5. UNION RESULT:union的结果
  6. SUBQUERY:子查询中的第一个select
  7. DEPENDENT SUBQUERY:子查询中第一个select,取决于外查询(在mysql中会有些优化,有些dependent会直接优化成simple)
  8. DERIVED:派生表的select(from子句的子查询)

table

显示数据来自于哪个表,有时不是真实的表的名字(虚拟表),虚拟表最后一位是数字,代表id为多少的查询

type

优化要重点关注的字段,这个字段直接反映SQL的性能是否高效

  • 这个字段值较多,这里我只重点关注我们开发中经常用到的几个字段:system,const,eq_ref,ref,range,index,all; 性能由好到差依次为:==system>const>eq_ref>ref>range>index>all==(一定要牢记)

system:表只有一行记录,这个是const的特例,一般不会出现,可以忽略 const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。 const eq_ref:唯一性索引扫描,表中只有一条记录与之匹配。一般是两表关联,关联条件中的字段是主键或唯一索引。

eq_ref ref:非唯一行索引扫描,返回匹配某个单独值的所有行

ref range:检索给定范围的行,一般条件查询中出现了>、<、in、between等查询

range index:遍历索引树。通常比ALL快,因为索引文件通常比数据文件小。all和index都是读全表,但index是从索引中检索的,而all是从硬盘中检索的。

index all:遍历全表以找到匹配的行

all possible_keys 显示可能应用在这张表中的索引,但不一定被查询实际使用

key 实际使用的索引。

key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。一般来说,索引长度越长表示精度越高,效率偏低;长度越短,效率高,但精度就偏低。并不是真正使用索引的长度,是个预估值。

ref 表示哪一列被使用了,常数表示这一列等于某个常数。

rows 大致找到所需记录需要读取的行数。

filter 表示选取的行和读取的行的百分比,100表示选取了100%,80表示读取了80%。

extra