mysql> explain select * from employees.employees limit 1\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE 查询类型
table: employees 当前查询被扫描到的表 可能是表的别名
partitions: NULL
type: ALL 表扫描方式
possible_keys: NULL 可能被使用到的索引
key: NULL 被使用的索引
key_len: NULL 使用过的索引的长度
ref: NULL
rows: 299246 扫描的数据的行数(examin)
filtered: 100.00 (返回比例)
Extra: NULL 额外的说明
id列:一般情况下如果不带子查询,id不增加.如果有子查询的,自查询数字增加,先执行子查询,即数据大的先执行.(从大到小).
select_type列:simple简单查询(不带子查询) PRIMARY子查询最外层查询
SUBQUERY(不在from后面子查询) DEPENDENT SUBQUERY
DERIVED(在from子句中的子查询) union:在union关键字的后的select语句
union result:采用匿名临时进行检索结果
table列:这列表示正在访问某个表
type:查询类型:查询效率依次下降. (system---const---eq_ref---ref---fulltext---ref_of_null----index_merge---unique_subquery---index_subquery---range---index----all)
ALL ----全表扫描index----按照索引的次序进行全表扫描range-----索引范围扫描
ref-----索引直接获取单个数据const----- -通过主键直接返回数据
执行计划列:
id列:用于表示select的列,如果都是简单查询则都是1,如果有子查询,则会进行增加,数据大的先执行。
查看执行计划的规则:(最大最上规则)
1.id相同,执行顺序由上至下
2.id不同,如果是子查询,id序号会递增,id值越大优先级越高,越先被执行。
3.id既有相同的,又有不同的。id如果相同认为是一组,执行顺序由上至下; 在所有组中,id值越大优先级越高,越先执行。
possible_keys列:可能会使用那些索引
key列:使用到的索引
Key_len列:索引长度列.可根据索引的使用长度来判断复合索引的使用情况.
Ref列:索引中查找到的值所用的列或者常量
rows列:MySQL需要扫描的行数
table列:这列表示正在访问某个表.
Select type列的值有:
1.PRIMARY:查询中包含任何复杂的子部分,最外层的查询
2.SUBQUERY:SELECT或WHERE中包含的子查询部分(不是from后的子查询).
3.DERIVED:在FROM中包含的子查询被标记为DERIVER(衍生), MySQL会递归执行这些子查询,把结果放到临时表中。
4.UNION:若第二个SELECT出现UNION,则被标记为UNION, 若UNION包含在FROM子句的子查询中,外层子查询将被标记为DERIVED。
5.UNION RESULT:从UNION表获取结果的SELECT
6.simple:简单查询,不包括子查询和union.
type列:查询类型:(12种)
system---const---eq_ref---ref---fulltext---ref_of_null----index_merge---unique_subquery---index_subquery---range---index----all
说明:按照此顺序查询效率依次下降。 (subquery:子查询)
Extra列的值:
1.using filesort需要使用额外的排序得到结果(进行内存排序或者硬盘排序)
2.using index优化器只需要使用索引就可以返回结果(覆盖索引)
3.using index condition优化器使用index condition pushdown优化
4.using join buffer优化器需要在使用join buffer
5.using mrr优化器使用mrr优化
6.using tpporary优化器需要使用临时表
7.using where优化器使用where过滤