MySQL篇:EXPLAIN解释

117 阅读4分钟

1. id

表示select查询的序列号,由一组数字组成,表示查询中select子句或者操作表的顺序。如果是子查询,id会递增。id值越大,优先级越高,越先被执行。

  • id相同:由上到下顺序执行。
  • id不同:id值越大优先级越高,越先被执行。
  • id不全相同:id值越大优先级越高,越先被执行;相同id顺序执行。

2. select_types

表示查询类型,主要用来区分普通查询、联合查询、子查询等复杂查询。

  • SIMPLE:表示查询不包含子查询或者 UNION 操作符,也没有任何其他特殊的限制。
  • PRIMARY:表示查询中包含了子查询,并且该子查询是被最外层查询所引用的。
  • SUBQUERY:表示查询中包含了子查询,但是该子查询不是被最外层查询所引用的。
  • DERIVED:表示查询中包含了派生表,派生表通常在 FROM 子句的列表中出现,并且被求值后存储在内存中供外部查询使用。
  • UNION:表示查询使用了 UNION 或 UNION ALL 操作符,可以有多个 SIMPLE 查询组成。
  • unoin result:从 UNION 表获取结果的SELECT查询(两种 UNION 结果的合并)。

3. table

表示查询检索的表。

4. type

表示查询使用了何种类型。

  • system:表示只有一行记录(也就是系统表),这是最快的一种类型。
  • const:表示通过索引一次就找到了,常数级别查询,如通过主键或唯一索引等完全匹配的查询。
  • eq_ref:表示在连接查询中使用 PRIMARY KEY 或者 UNIQUE 索引。
  • ref:表示使用普通索引进行查询,返回匹配某个单个值的数据行,常见于多表关联查询中的查询条件。
  • range:表示使用索引返回一个范围内的数据行,当我们使用 BETWEEN、<、>、IN 等操作符时会出现这种情况,此时需要确认查询语句是否利用了索引。
  • index:表示 full index scan,表示扫描整张表,与全表扫描的区别在于,它是从索引中扫描的,而不是从数据文件中扫描的。
  • all:表示 full table scan,表示全表扫描,这是最慢的一种查询。

5. possible_keys

表示该查询可能使用到的一个或多个索引,但不一定被查询实际使用。

6. key

表示查询中实际使用的索引。如果为NULL,则表示没有使用索引。

如果查询使用了覆盖索引,则该索引仅出现在key中。

覆盖索引:要查询的字段和索引建立的字段(个数和顺序)一致。

7. key_len

表示索引使用到的字节数。在不损失精度的情况下,长度越短越好。

key_len的值为索引字段的最大可能长度,而不是实际使用长度。

8. ref

表示用到的索引是非唯一性扫描,显示索引的哪一列被使用,如果可能,是一个常数。

9. rows

表示根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

10. extra

表示非常重要的额外信息。

  • Using index:表示 MySQL 使用了覆盖索引(Covering Index)扫描整个查询或使用到了所请求的字段的索引。
  • Using where:表示 MySQL 将条件进行了过滤,在存储引擎层面上去除了不满足条件的行。
  • Using temporary:表示 MySQL 在执行查询时创建了一个临时表,通常是因为查询包含了 GROUP BY 和 ORDER BY 子句,并且排序方式与表定义的索引不同,无法直接从现有索引满足此类查询。
  • Using filesort:表示 MySQL 无法利用索引完成排序操作,而需要额外的文件排序来满足 ORDER BY 或者 GROUP BY 子句,这种情况下建议优化查询语句,比如添加合适的索引等方式,尽量避免文件排序。
  • Range checked for each record:表示 MySQL 在执行查询前检查每一行是否满足 WHERE 条件,如果不满足则跳过该行继续进行下一行检查。
  • Using join buffer:表示 MySQL 正在使用连接缓存,这通常发生在当连接关联的表很多时。
  • Using index condition:表示 MySQL 可以利用索引提取数据,但仍然需要执行辅助条件,这些条件并不属于最佳索引使用情况。
  • Using sort_union(...):表示在 UNION 查询中使用了排序优化,在执行过程中可以避免使用 additional sorting pass 算法。
  • Using intersect(...):表示在 UNION 查询中使用了交集优化,在执行过程中可以避免使用临时表。
  • Using index for group-by:表示 MySQL 遵循”Index-Only“策略从索引中获取 GROUP BY 的结果,而不是通过扫描全表来获得。
  • Using join cache(...):表示 SQL 服务器正在使用连接缓存。