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操作,在找到第一匹配的元组后即停止找同样值的动作