当你使用 MySQL 的 EXPLAIN 命令来分析你的 SQL 查询时,这个工具会提供一个查询计划,显示了 MySQL 如何执行你的 SQL 查询。这对于理解性能瓶颈和优化查询非常有帮助。以下是 EXPLAIN 输出中每个字段的详细解释:

1. id

  • 查询中的选择标识符。在复杂查询中,每个SELECT关键字都对应一个唯一的ID。单表查询通常为 1。

2. select_type

  • 查询类型。有多种类型,如 SIMPLE(简单的SELECT,不使用子查询或UNION)、PRIMARY(查询中最外层的SELECT)、SUBQUERY(子查询中的第一个SELECT)、等等。

3. table

  • 输出行所引用的表名。在复合查询中,可能会显示为临时表。

4. partitions

  • 查询涉及的分区信息。对于未分区的表,此列为 NULL。

5. type

  • 访问类型,显示了 MySQL 如何查找表中的行。常见类型包括:

    • system:表只有一行(等同于系统表)。这是最快的。

    • const:使用主键或唯一索引读取一行。适用于比较索引和常数。

    • eq_ref:对于每个来自前一个表的行,从此表中读取一行。使用主键或唯一索引。

    • ref:非唯一索引的参与。

    • range:检索给定范围的行。

    • index:只通过索引来检索数据,不访问表的其它部分。

    • ALL(全表扫描):最慢的访问类型。

6. possible_keys

  • 显示可能被此查询使用到的索引。

7. key

  • 实际使用的索引。如果没有使用索引,则为 NULL。

8. key_len

  • 使用的索引的最长可能的键长度。显示的是索引中使用的字节数。

9. ref

  • 显示使用索引的列或常数。用于索引键的比较。

10. rows

  • 预计要检查的行数,帮助评估查询的成本。

11. filtered

  • 表示返回结果的行占扫描行的百分比。

12. Extra

  • 包含重要的额外信息,如:

    • Using index:表示查询能够仅使用索引中的信息来获取数据,无需额外访问表。

    • Using where:表示使用了 WHERE 子句。

    • Using temporary:表示使用了临时表,通常出现在需要对数据进行排序或合并操作的查询中。

    • Using filesort:表示 MySQL 将在内存或磁盘上进行额外的排序操作,这通常不使用索引。

理解 EXPLAIN 的输出可以帮助你优化查询,改进数据库的性能。