查看执行计划
参数说明
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层进行过滤返回符合要求的记录
近期评论