⑨. Extra字段
①. Using index:使用覆盖索引
覆盖索引定义:mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值
mysql> explain select film_id from film_actor where film_id = 1;
②. Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖
mysql> explain select * from actor where name = 'a';
③. Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
mysql> explain select * from film_actor where film_id > 1;
④. Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化
# 1. actor.name没有索引,此时创建了张临时表来distinct mysql> explain select distinct name from actor; #2. film.name建立了idx_name索引,此时查询时extra是using index,没有用临时表 mysql> explain select distinct name from film;
⑤. Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的
# 1. actor.name未创建索引,会浏览actor整个表,保存排序关键字name和对应的id,然后排序name并检索行记录 mysql> explain select * from actor order by name; # 2. film.name建立了idx_name索引,此时查询时extra是using index mysql> explain select * from film order by name;
⑥. Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段是
mysql> explain select min(id) from film;