MySQL高级——Explain信息中Extra字段解释

一、Explain信息中Extra字段解释

  • 包含不适合在其他列中显示但十分重要的额外信息。
  • 主要包括: Using filesort 、Using temporary 、Using index、Using where、Using join buffer、impossible where、select tables optimized away、distinct

二、Using filesort(重要指标)

1、Using filesort解释

  • 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
  • MySQL中无法利用索引完成的排序操作称为“文件排序”

2、示例1

建立了col1、col2、col3三个字段的复合索引,排序也是按照索引的顺序。
排序时没有按照建立复合索引字段col1、col2、col3的顺序进行,因此产生了外部的索引排序。效率低。

在这里插入图片描述
3、示例2

建立了col1、col2、col3三个字段的复合索引,排序也是按照索引的顺序。
排序时按照建立复合索引字段col1、col2、col3的顺序进行,因此没有外部的索引排序。效率高

在这里插入图片描述

三、Using temporary(重要指标)

1、Using temporary解释

  • 使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。

2、示例1

建立了col1、col2两个字段的复合索引,排序也是按照索引的顺序。
分组时没有按照建立复合索引字段col1、col2的顺序进行,因此产生了临时表和外部的索引排序。效率低
在这里插入图片描述

3、示例2

建立了col1、col2两个字段的复合索引,排序也是按照索引的顺序。
分组时按照建立复合索引字段col1、col2的顺序进行,因此没有产生临时表并且也没有使用外部的索引排序,因此效率高。
在这里插入图片描述

四、Using index(重要指标)

1、Using index解释

  • 表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错
  • 如果同时出现using where,表明索引被用来执行索引键值的查找;
  • 如果没有同时出现using where,表明索引只是用来读取数据而非利用索引执行查找。

2、示例1

在这里插入图片描述

3、示例2

这里是引用

4、覆盖索引(Covering Index)

推荐理解方式一

  • 理解方式一:就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
  • 理解方式二:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。

覆盖索引示例

  • select id, name from t_xxx where age=18;
  • 有一个组合索引 idx_id_name_age_xxx 包含了(覆盖了),id,name,age三个字段。查询时直接将建立了索引的列读取出来了,而不需要去查找所在行的其他数据。所以很高效。

注意:

  • 如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可使用select * 的查询方式
  • 因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

五、Using where(一般重要指标)

  • 表明使用了where过滤

六、Using join buffer(一般重要指标)

1、Using join buffer解释

  • 表明使用了连接缓存:

2、示例

出现在当两个连接时
驱动表(被连接的表,left join 左边的表。inner join 中数据少的表) 没有索引的情况下。
给驱动表建立索引可解决此问题。且 type 将改变成 ref
在这里插入图片描述

七、impossible where(一般重要指标)

1、impossible where解释

  • where子句的值总是false,不能用来获取任何元组

2、示例
在这里插入图片描述

八、select tables optimized away(不常用指标)

  • 在没有GROUPBY子句的情况下,基于索引优化min/max操作或者
    对于MyIsam存储引擎优化count(*)操作,不必等到执行阶段再进行计算,
    查询执行计划生成的阶段即完成优化。

九、distinct(不常用指标)

  • 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作