4.possible_key、key
可能用到的索引和实际用到的索引。如果是 NULL 就代表没有用到索引。 复制代码
possible_key 可以有一个或者多个,可能用到索引不代表一定用到索引。 复制代码
反过来,possible_key 为空,key 可能有值吗? 复制代码
表上创建联合索引: 复制代码
ALTER TABLE user_innodb DROP INDEX comidx_name_phone; ALTER TABLE user_innodb add INDEX comidx_name_phone (name,phone); 复制代码
执行计划(改成 select name 也能用到索引): 复制代码
explain select phone from user_innodb where phone='126'; 复制代码
结论:是有可能的(这里是覆盖索引的情况)。 复制代码
如果通过分析发现没有用到索引,就要检查 SQL 或者创建索引。 复制代码
5.key_len
索引的长度(使用的字节数)。跟索引字段的类型、长度有关。 复制代码
表上有联合索引:KEY 复制代码
comidx_name_phone
(name
,phone
)
explain select * from user_innodb where name ='jim'; 复制代码
6.rows
MySQL 认为扫描多少行才能返回请求的数据,是一个预估值。一般来说行数越少越好。 复制代码
7.filtered
这个字段表示存储引擎返回的数据在 server 层过滤后,剩下多少满足查询的记录数量的比例,它是一个百分比。 复制代码
8.ref
使用哪个列或者常数和索引一起从表中筛选数据。 复制代码
9.Extra
执行计划给出的额外的信息说明。 复制代码
using index
用到了覆盖索引,不需要回表。 复制代码
EXPLAIN SELECT tid FROM teacher ; 复制代码
using where
使用了 where 过滤,表示存储引擎返回的记录并不是所有的都满足查询条件,需要在 server 层进行过滤(跟是否使用索引没有关系)。 复制代码
EXPLAIN select * from user_innodb where phone ='13866667777'; 复制代码
using filesort
不能使用索引来排序,用到了额外的排序(跟磁盘或文件没有关系)。需要优化。(复合索引的前提) 复制代码
ALTER TABLE user_innodb DROP INDEX comidx_name_phone; ALTER TABLE user_innodb add INDEX comidx_name_phone (name,phone); 复制代码
EXPLAIN select * from user_innodb where name ='jim' order by id; 复制代码
(order by id 引起) 复制代码
using temporary
用到了临时表。例如(以下不是全部的情况): 复制代码
1、distinct 非索引列 复制代码
EXPLAIN select DISTINCT(tid) from teacher t; 复制代码
2、group by 非索引列 复制代码
EXPLAIN select tname from teacher group by tname; 复制代码
3、使用 join 的时候,group 任意列 复制代码
EXPLAIN select t.tid from teacher t join course c on t.tid = c.tid group by t.tid; 复制代码
需要优化,例如创建复合索引。 复制代码
总结一下:
模拟优化器执行 SQL 查询语句的过程,来知道 MySQL 是怎么处理一条 SQL 语句的。通过这种方式我们可以分析语句或者表的性能瓶颈。
分析出问题之后,就是对 SQL 语句的具体优化。