本文主要介绍在执行expain命令获得的结果的各个字段的含义。
执行方式
expain +[SQL]
返回字段含义
字段名 | 含义 | 可能值 | 可能值的含义 |
---|---|---|---|
id | SQL执行的顺利的标识,SQL从大到小的执行 | [数字] | |
select_type | select类型 | SIMPLE | 简单SELECT(不使用UNION或子查询等) |
PRIMARY | 最外层的select | ||
UNION | UNION中的第二个或后面的SELECT语句 | ||
DEPENDENT UNION | UNION中的第二个或后面的SELECT语句,取决于外面的查询 | ||
UNION RESULT | UNION的结果。 | ||
SUBQUERY | 子查询中的第一个SELECT. | ||
DEPENDENT SUBQUERY | 子查询中的第一个SELECT,取决于外面的查询 | ||
DERIVED | 派生表的SELECT(FROM子句的子查询) | ||
table | 显示这一行的数据是关于哪张表的. | ||
type | 显示了连接使用了哪种类别,有无使用索引 | const(system) | 表最多有一个匹配行,它将在查询开始时被读取 |
eq_ref | 唯一性索引扫描 | ||
ref | 非唯一性索引扫描,返回匹配某个单独值的所有行 | ||
range | 只检索给定范围的行,使用一个索引来选择行 | ||
index | Full Index Scan,Index与All区别为index类型只遍历索引树 | ||
all | Full Table Scan 将遍历全表以找到匹配的行 | ||
possible_key | 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用 | ||
key | 实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效) | ||
key_len | 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好 |
||
rows | 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好 | ||
Extra | 该列包含MySQL解决查询的详细信息 | Distinct | 一旦MYSQL找到了与行相联合匹配的行,就不再搜索了 |
Not exists | MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了 | ||
Range checked for each | 没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一 | ||
Using filesort | 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 | ||
Using index | 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候 | ||
Using temporary | 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上 | ||
Using where | 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题 | ||
using join buffer | 表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。 |
参考:https://blog.csdn.net/qq_27399407/article/details/93741225