possible_keys
解释:指出 MySQL 能在该表中使用哪些索引有助于 查询。如果为空,说明没有可用的索引。
key
解释:MySQL 实际从 possible_key 选择使用的索引。 如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情 况下,可以在 SELECT 语句中使用 USE INDEX (indexname)来强制使用一个索引或者用 IGNORE INDEX(indexname)来强制 MYSQL 忽略索引
key_len
解释:表示索引中使用的字节数,使用的索引的长度。可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
ref
解释:显示索引的哪一列被使用了,如果可能得话是一个常数,那些列或常量别用于查找索引列上的值。
rows
解释:MYSQL 认为必须检查的用来返回请求数据的行数
extra(不便展示于其他列但又十分重要的额外信息)
- Using filesort
说明mysq|会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySOL中无法利用索引完成的排序操作称为“文件排序”
- Using temporary
解释:已经火烧眉毛了,内部新建了临时表,使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
- Using index
解释:表示相应的select操作中使用了覆盖索引(Covering Index), 避免访问了表的数据行,效率不错!如果同时出现usingwhere,表明索引被用来执行索引键值的查找;如果没有同时出现usingwhere,表明索引用来读取数据而非执行查找动作。
覆盖索引(Covering Index)
- 理解方式一:
就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
- 理解方式二:
索引是高效找到行的一一个方法,但是- -般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。
- 注意:
如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *
因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。
- Using where
解释:表明使用了where过滤
- Using join buffer
解释:表明使用了链接缓存
- impossible where
解释:where字句的值总是false,不能用来获取任何元素。
- select tables optimized away
解释:在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。