Explain
Explain
一、是什么
查看执行计划
使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。
explain主要用于分析查询语句或表结构的性能瓶颈。
二、能干什么
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
三、怎么用
EXPLAIN SQL语句;
EXPLAIN SELECT * FROM `tbl_emp`;
四、各字段解释
1. id ★
id 相同,执行顺序由上至下
id 不同,子查询,id值越大优先级越高
id相同不同,不同的按数字大小执行,相同的由上至下执行。
2. select_type
SIMPLE 普通查询
PRIMARY 查询中包含任何子查询的最外层查询
SUBQUERY 子查询
DERIVED 子查询的结果形成的临时表
UNION 第二个select出现在union后被标为union若union在from子句的子查询中,外层select为DERIVED
UNION RESULT 从union表中获取结果的select
3. table
显示的数据是哪个表的
4. type ★
性能从1-7依次降低
all 7 全表扫描
index 6 index与all的区别为index类型只遍历索引树
range 5 只检索给定范围的行,使用一个索引来选择行between and,in
ref 4 非唯一性索引扫描,返回某个单独值的所有行
eq_ref 3 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,PRIMARY KEY OR UNION
const 2 通过索引一次就找到,PRIMARY KEY OR UNION 只匹配一行数据
system 1 表只有一行记录
NULL
5. possible_keys
查询涉及到的字段上若存在索引,则该索引被列出,但是不一定被查询实际使用
6. key ★
实际使用的索引,null没有使用。查询中若查询的字段刚好是设置的索引,则索引出现在key中。
7. key_len
显示的值为索引字段的最大可能长度,并非实际使用的长度。
8. ref
显示索引的那一列被使用了,如果可能的话,是一个常数。那些列或常量被用于查询索引列上的值。
9. rows ★
根据表统计的信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。
10. Extra ★
显示十分重要的额外信息
Using filesort | 使用一个外部的索引排序 |
---|---|
Using temporary | 使用了临时表保存中间结果,mysql在对查询结果排序时使用临时表。 |
Using index | 表示相应的select操作使用了覆盖索引,避免了访问表的数据行;如果同时出现using where ,表明索引被引用来执行索引值的查找 ;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作 |
Using where | 表明使用了where过滤 |
using join buffer | 使用了连接缓存 |
impossible where | where子句的值总是false,不能用来获取任何元组 |
select table optimized away | 在没有group by 子句的情况下,基于索引优化min/max操作 |
distinct | 优化distinct操作,在找到第一匹配的元组后即停止找相同值的动作 |