执行计划中的 `Extra` 字段有哪些常见的取值?分别是什么含义?

推荐答案

在 MySQL 的执行计划中,Extra 字段提供了关于查询执行的额外信息。以下是一些常见的取值及其含义:

  • Using where: 表示 MySQL 服务器在存储引擎返回行之后,使用了 WHERE 条件来进一步过滤行。
  • Using index: 表示查询只需要使用索引即可完成,不需要访问表的数据行。这通常发生在覆盖索引的情况下。
  • Using index condition: 表示 MySQL 使用了索引条件下推(Index Condition Pushdown, ICP)优化,可以在存储引擎层过滤数据。
  • Using temporary: 表示 MySQL 需要创建一个临时表来存储中间结果,通常发生在 GROUP BYDISTINCT 操作中。
  • Using filesort: 表示 MySQL 需要对结果进行排序,但无法使用索引来完成排序,因此需要额外的文件排序操作。
  • Using join buffer: 表示 MySQL 使用了连接缓冲区(Join Buffer)来优化连接操作,通常发生在连接表时无法使用索引的情况下。
  • Impossible WHERE: 表示 WHERE 条件永远为假,因此查询不会返回任何行。
  • Select tables optimized away: 表示 MySQL 优化器已经优化掉了某些表,通常发生在查询中使用了聚合函数且不需要访问表数据的情况下。
  • Distinct: 表示 MySQL 正在执行 DISTINCT 操作,以消除重复的行。
  • Full scan on NULL key: 表示 MySQL 在执行子查询时,发现某个键为 NULL,因此需要执行全表扫描。

本题详细解读

Using where

当 MySQL 执行查询时,如果 WHERE 条件无法在存储引擎层完全过滤数据,MySQL 会在服务器层进一步过滤数据。这种情况下,Extra 字段会显示 Using where

Using index

当查询只需要使用索引即可完成时,Extra 字段会显示 Using index。这通常发生在覆盖索引的情况下,即查询的列都包含在索引中,不需要回表查询数据行。

Using index condition

索引条件下推(ICP)是 MySQL 5.6 引入的一种优化技术。当查询条件可以在索引中过滤时,MySQL 会将过滤条件推送到存储引擎层,从而减少需要返回给服务器层的数据量。这种情况下,Extra 字段会显示 Using index condition

Using temporary

当 MySQL 需要创建一个临时表来存储中间结果时,Extra 字段会显示 Using temporary。这通常发生在 GROUP BYDISTINCT 操作中,或者当查询需要排序但无法使用索引时。

Using filesort

当 MySQL 需要对结果进行排序,但无法使用索引来完成排序时,Extra 字段会显示 Using filesort。这种情况下,MySQL 会使用文件排序算法来对结果进行排序。

Using join buffer

当 MySQL 在执行连接操作时,如果无法使用索引来优化连接,MySQL 会使用连接缓冲区(Join Buffer)来存储中间结果。这种情况下,Extra 字段会显示 Using join buffer

Impossible WHERE

WHERE 条件永远为假时,MySQL 不会返回任何行。这种情况下,Extra 字段会显示 Impossible WHERE

Select tables optimized away

当 MySQL 优化器发现某些表在查询中不需要访问时,会将这些表优化掉。这种情况下,Extra 字段会显示 Select tables optimized away

Distinct

当 MySQL 执行 DISTINCT 操作时,Extra 字段会显示 Distinct。这表示 MySQL 正在消除查询结果中的重复行。

Full scan on NULL key

当 MySQL 在执行子查询时,发现某个键为 NULL,因此需要执行全表扫描。这种情况下,Extra 字段会显示 Full scan on NULL key

这些 Extra 字段的取值可以帮助开发者更好地理解查询的执行过程,并优化查询性能。

纠错
反馈