语法:explain select …
ID:SELECT识别符,id值越高,执行级别越高,如果ID相同,执行顺序由上到下
SELECT_TYPE:select 语句的类型
常用值:
SIMPLE:简单查询 不涉及 join 查询以及 子查询
PRIMARY:主查询或者是外层的查询
SUBQUERY:子查询
UNIOn 与 UNIOn RESULT:联合查询
TYPE(重点指标):访问类型,表示 MYSQL在表中找到所需行的方式 ,优化最好能达到range级别 甚至是REF级别
常用值:
ALL: 全表扫描
INDEX: 遍历整个索引树,如果有出现回表问题 就不出现这个类型
RANGE: 使用索引 检索 给定范围的行,一般where 中出现 between in > <
REF:非唯一性索引扫描,索引访问但可能返回多个符合条件的行
EQ_REF:多表连接中 使用了 primary_key 或 unique key作为关联条件
CONST:通过索引一次就能找到,通常是primary_key 或 unique索引列查找
SYSTEM:表中只有一条数据的查询 NULL:
POSSIBLE_KEYS:可能使用到的索引
KEY:使用的索引(重点指标)
KEY_LEN:索引的长度(不是重点指标)
计算方法:
类型字节(int +4 ; varchar(10) 10个字符 utf8 30个字节 gbk 20个字节 ) + 可变长(+2)+允许为空(+1)
68 =( age int 4个 + username varchar 20*3个) + (2个 username varchar 可变长)+(1个 age允许为空 + 1个 username允许为空)
REF:哪一列被使用了,const表示该列等于某个常数
ROWS:查询SQL语句扫描的数据量 不是很准确 属于 约等于,当使用索引时候 rows的值不应该超过全表数据的 1/3 (重点指标)
EXTRA:额外的信息(重点指标)
using filesort:无法利用索引进行排序,只能在外部内存中或磁盘中进行排序工作叫做 文件排序,效率不怎么好。 索引在 where 中产生 order by 不会产生索引,只能利用索引进行排序,从结果2可以看出
要想不出现这个需要满足三点:
(1)使用了索引,explain 参数key能知道
(2)order by 字段 这个字段必须是 在这个索引key 里面
(3)如果是使用组合索引,需要符合最左匹配原则 例如 index(username,sex,age) 查询 where username=’‘aa’ order by age 不符合原则 还是会出现 using filesort 这个额外信息
Using temporary:表中常常涉及group by union 合并 distinct 去重 还有多表查询 order by排序 ,如果不能有 效利用索引来完成查询,MySQL很有可能寻求通过建立内部的临时表来执行查询
Using where:不能使用索引进行过滤,只能类似于 using filesort只能在外部完成过滤操作
Using index condition:需要进行回表,但是使用了索引,并且需要利用索引进行数据查询以及一些数据排序工作 (下面例子就知在 使用 username 索引情况 利用 status进一步的查询)
USING index:效率不错,避免回表操作,直接在索引树能完成数据的获取工作,如果还出现了 user where 代表 利用索引进行进一步的过滤
性能 从下往上 依次增加