Mysql执行计划详细

323 阅读4分钟

查看执行计划

参数说明

id,select_type,table,type,possible_keys,key,ken_len,ref,rows,Extra

--创建普通索引/组合索引

alter table 表名 add index 索引名(索引列)

--创建唯一索引

alter table 表名 add unique index 索引名(索引列)

--创建全文索引

alter table 表名 add fulltext 索引名(索引列)

id
  • 每个SELCET语句都会自动分配的一个唯一标识符

  • 表示查询中操作表的顺序,有3中情况

    • id相同:执行顺序由上到下
    • id不同:如果是子查询,id会自增,id越大,优先级越高
    • id为null的表示这是一个结果集,不需要使用它进行查询
select_type

查询类型,主要用于区别普通查询、联合查询(union、union all)、子查询等复杂查询

simple

表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个

primary

一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个

subquery

除了from子句中包含的子查询外,其他地方出现的子查询都可能是subquery

dependent subquery

与dependent union类似,表示这个subquery的查询要受到外部表查询的影响

union

union连接的两个select查询,第一个查询是PRIMARY,除了第一个表外,第二个以后的表的select_type都是union

dependent union

与union一样,出现在union或union all语句中,但是这个查询要受到外部查询的影响

union result

包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null

derived

from子句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联使徒或嵌套select

table
  • 显示的查询表名,如果查询使用了别名,那么这里显示别名
  • 如果不涉及对数据表的操作,那么这显示为null
  • 如果显示尖括号括起来的就表示这是个临时表,后边的N就是执行计划的id,表示结果来自于这个查询产生
  • 如果尖括号括起来的<union M,N>,与类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集
type
  • 依次从好到差:

system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL

出了all之外,其他的type都可以用到索引,出了index_merge之外,其他的type只可以用到一个索引

  • 注意事项:

最少要索引使用到range级别

system

表中只有一行数据或者是空表

const

使用唯一索引或者主键,返回记录一定是一行记录的等值where条件时,通常type是const,其他数据库也叫作唯一索引扫描

eq_ref

关键字:连接字段主键或者唯一索引

此类型通常出现在多表join查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果,并且查询的比较操作符通常是“=”,查询效率高

ref

针对非唯一索引,使用等值(=)查询非主键,或者是使用了最左前缀规则索引的查询

fulltext

全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引

ref_or_null

与ref方法相似,只是增加了null值的比较,实际用的不多

unique_subquery

用于where中的in形式子查询,子查询返回不重复值唯一值

index_subquery

用于in形式的子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重

range

索引范围扫描,常见于使用>,<,is null,between,in,like等运算符的查询中

index_merge

表示查询使用了两个以上的索引,最后取交集或者并集,常见and,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上犹豫要读取所个索引,性能可能大部分时间都不如range

index

关键字:条件时出现在索引树中的节点的,可能没有完全匹配索引

索引全表扫描:把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询,可以使用索引排序或者分组的查询

all

这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录