MySQL 优化---Explain关键字详解(二)

MySQL执行计划Explain关键字详解

环境说明
Centos版本: CentOS Linux release 7.7.1908 (Core)
Linux连接工具:SecureCRT
MySQL Version: 5.7.28
MySQL连接工具:Navicate
参考地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

Explain是干什么的

EXPLAIN语句提供有关MySQL如何执行语句的信息。 EXPLAIN可以作用于 SELECT, DELETE, INSERT, REPLACE,和 UPDATE
语句。EXPLAIN为SELECT语句中使用的每个表返回一行信息。它按照MySQL在处理语句时读取它们的顺序列出了输出中的表。MySQL
用嵌套循环连接方法解析所有连接。这意味着MySQL从第一个表中读取一行,然后在第二个表,第三个表中找到匹配的行,依此类推。
处理完所有表后,MySQL将通过表列表输出选定的列和回溯,直到找到一个表,其中存在更多匹配的行。从该表中读取下一行,然后继续
下一个表。

举例说明个字段的含义

在这里插入图片描述

id字段

SELECT的标识符。这是SELECT查询中的序号,值越高执行的优先级越高,值相同,依次执行

select_type字段

查询类型,用于区别普通查询,复合查询、子查询等复杂查询
SIMPLE:简单SELECT查询(不使用 UNION或子查询)
PRIMARY:如果有复杂的子查询,最外层标记为primary;
UNION:若第二个select出现在union之后,标记为union,若union包含在from字句的子查询中,外层的select将被标记为derived
UNION RESULT:从union表获取结果的select
SUBQUERY:First SELECT in subquery
Derived:衍生查询

table字段

查询的表

table字段

查询的表

partitions字段

待定

type字段

访问类型,是一个重要的指标,常见的指标排序:system > const > eq_ref > ref >range > all
system:表只有一条数据
const:通过索引只查一次就能找到
eq_ref:唯一性索引扫描,表中只有一条记录匹配
ref:非唯一性索引扫描,表中有多条记录匹配
range:检索给定范围
all:全表扫描

possible_keys字段

SELECT可能用到的索引

key字段

实际用到的索引

key_len字段

官方解释:The key_len column indicates the length of the key that MySQL decided to use. The value of key_len
enables you to determine how many parts of a multiple-part key MySQL actually uses. If the key column says
NULL, the len_len column also says NULL.Due to the key storage format, the key length is one greater for a column
that can be NULL than for a NOT NULL column.
理解:就是索引所占列的字节数总和,根据这个值可以判断索引的使用情况,特别是在组合索引的时候,判断该索引有多少部分被使用到
非常重要。
并且:不损失精确性的情况下,长度越短越好

ref字段

官方解释:The ref column shows which columns or constants are compared to the index named in the key column
to select rows from the table.
理解:对前面的tpye的一个详细显示,很有可能是一个常量,比如用到的索引是什么type,用到主键具体是那个数据库哪张表的主键

rows字段

官方解释:The ref column shows which columns or constants are compared to the index named in the key column
to select rows from the table.For InnoDB tables, this number is an estimate, and may not always be exact.
理解:MySQL认为执行该查询需要扫描的行数,但是如果是才用的InnoDB引擎,这个数据并不总是准确的

filtered字段

官方解释:The filtered column indicates an estimated percentage of table rows that will be filtered by the table
condition. The maximum value is 100, which means no filtering of rows occurred. Values decreasing from 100
indicate increasing amounts of filtering. rows shows the estimated number of rows examined and rows × filtered
shows the number of rows that will be joined with the following table. For example, if rows is 1000 and filtered
is 50.00 (50%), the number of rows to be joined with the following table is 1000 × 50% = 500.
解释:~~~~

Extra字段

性能按Extra排序
Using index:用了覆盖索引
Using index condition:用了条件索引(索引下推)
Using where:从索引查出来数据后继续用where条件过滤
Using join buffer (Block Nested Loop):join的时候利用了join bu?er(优化策略:去除外连接、增大join buffer大小)
Using filesort:用了文件排序,排序的时候没有用到索引
Using temporary:用了临时表(优化策略:增加条件以减少结果集、增加索引,思路就是要么减少待排序的数量,要么就提前排好序)
Start temporary, End temporary:子查询的时候,可以优化成半连接,但是使用的是通过临时表来去重
FirstMatch(tbl_name):子查询的时候,可以优化成半连接,但是使用的是直接进行数据比较来去

  • 有以下几种常见情况:

Using index 代表索引覆盖,就是查询的列正好在索引中,不用回物理行查询数据
Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的
部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:在许多查询的执行过程中,MySQL可能会借助临时表来完成一些功能,比如去重、排序之类的,比如我们在执
行许多包含DISTINCT、GROUP BY、UNION等子句的查询过程中,如果不能有效利用索引来完成查询,MySQL很有可能寻求通过建立
内部的临时表来执行查询。如果查询中使用到了内部的临时表,在执行计划的Extra列将会显示Using temporary提示。
Using filesort:很多情况下排序操作无法使用到索引,只能在内存中(记录较少的时候)或者磁盘中(记录较多的时候)进行
排序,这种在内存中或者磁盘上进行排序的方式统称为文件排序(英文名:?lesort)。如果某个查询需要使用文件排序的方式执行查
询,就会在执行计划的Extra列中显示Using ?lesort提示。

  • 可能会有其他情况值:

no table used:当查询语句的没有FROM子句时将会提示该额外信息。
Impossible where:查询语句的WHERE子句永远为FALSE时将会提示该额外信息。
No Matching min/Max row当查询列表处有MIN或者MAX聚集函数,但是并没有符合WHERE子句中的搜索条件的记录时,将会提示该额外信息。
Using index condition:有些搜索条件中虽然出现了索引列,但却不能使用到索引(在MySQL 5.6版本后加入的新特性)

原创文章 25 获赞 0 访问量 1822

猜你喜欢

转载自blog.csdn.net/ttf0203/article/details/103916988