explain 查看sql的执行计划,使用该关键字可以查看分析sql 语句在 mysql 中的执行步骤,索引的使用,可以检查该sql 语句和表结构的性能瓶颈,在sql 优化中工作可以说该关键字是相关开发工作人员必会的。
用法: explain 查询语句;
??
explain 返回结果说明
- 1. id
- 2. select_type
- 3. table
- 4. partitions
- 5. type
- 6. possible_keys
- 7. key
- 8. key_len
- 9. ref
- 10. row
- 11. filtered
- 12. Extra
1. id
?
通过该id字段,可以查看出sql语句的执行顺序
id 相同, 查询执行表顺序由上至下
id 不同,如果是子查询 id的序号会递增,id值越大优先级越高,则优先会执行
id 有的相同有的不同,则id序号大的会优先执行,id相同的由上到下执行
?
2. select_type
查询sql的类型
类型 | 说明 |
---|---|
SIMPLE | 简单的select查询,查询中不包含子查询或UNION |
PRIMARY | 查询中若包含如何复杂的子查询,最外层标记为 PARIMARY,一般最后加载的表 |
SUBQUERY | 在select 或 where 列表中包含子查询语句 |
DERIVED | 在from 列表中包含的子查询标记为DERIVED (衍生) mysql 会递归执行这些查询,把结果集放在临时表中 |
UNION | 出现在 UNION 之后的查询语句会被标记为 UNION, 若UNION包含在FROM 子句的子查询中,外层SELECT将被标记为DERIVED |
UNION RESULT | UNION 查询的结果集 |
3. table
查询的表名称,显示所查询的表名称,如果要是别名则显示别名,衍生表显示<derived>
4. partitions
如果查询是基于分区表的话,会显示查询将访问的分区。
5. type
查询数据的类型,性能由好到差排列
system > const > eq_ref > ref > fultext > ref_or_null > index _merge > unique_subquery > index_subquery > range > index >ALL
system | 表只能一行记录(等于系统表),const类型的特列,平时基本不会出现。 |
---|---|
const | 表示通过索引一次就能找到,const用于比较parmary_key 或者 unique 索引,因为只匹配一行数据,所以主键至于where列表中,mysql就能将该查询转换为一个常量 |
eq_ref | 唯一性索引扫描,对每个索引建,表中只有一条记录与之匹配,常建于主键或唯一索引扫描 |
ref | 非唯一性索引扫描,返回匹配某个单独值的所有行本质上也是一种索引访问,他返回所有匹配某个单独值的行,然而,他可能会出现找到多个符合条件的行,所以他应该属于查找和扫描的混合体 |
range | 只检索指定范围的行,使用一个索引来选择行,key 列显示使用了那个索引一般就是在where语句出现了between、<、>、in等的查询。这种范围扫描索引比扫描全表要好,因为扫描的只是某个范围区间。 |
index | full index sacn,index 与all的区别是,index类型只遍历索引树,通常比all快。因为索引文件通常比数据文件小. |
all | full table sacn,将遍历全表以找到匹配的行 |
6. possible_keys
列出查询sql可能会用到的索引,该值可能会一个或多个,但不一定在实际查询中被用到
7. key
列出查询sql中实际被使用到的索引,显示null 则没有使用索引
8. key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key-len是根据表定义计算而得,不是通过表内检索出的
9. ref
显示索引的那一列被使用,如果可能的话,是一个常数。哪些列或常量被用于查找索引列的值
10. row
根据表统计信息及索引引用情况,大致估算出找到所需的记录所需读取的行数。
11. filtered
查询条件过滤的行数的百分比
12. Extra
包含不适合在其它列中显示但十分重要的额外信息
Using filesort | 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql 中无法利用索引完成的排序操作称为 ‘文件内排序’ |
---|---|
Using temporary | 使用临时表保存中间结果,mysql 在对查询结果排序的时候使用了临时表,常见于排序 order by |
Using index | 表示相应的select 操作中使用了复合索引,避免访问了表的数据行,效率不错。如果同时出现了 using where,表明索引被用来执行索引键值查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。 |
Using where | 使用了where 过滤 |
Using join buffer | 使用了连接缓存 |
impossible where | where子句的值总是false,不能获取任何数据 |
select tables optimized away | 在没有group by 子句的情况下,基于索引优化MIN/MAX操作或者myisam存储引擎优化count(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即完成优化 |