如何查看 SQL 语句的执行计划?

推荐答案

在 MySQL 中,可以通过 EXPLAINEXPLAIN FORMAT=JSON 命令来查看 SQL 语句的执行计划。执行计划可以帮助你了解 MySQL 是如何执行查询的,包括使用了哪些索引、表的连接顺序、扫描的行数等信息。

或者使用 JSON 格式的输出:

本题详细解读

1. EXPLAIN 命令的作用

EXPLAIN 命令用于分析 MySQL 如何执行 SQL 查询。它会返回一个表格,其中包含了查询的执行计划信息。通过分析这些信息,可以优化查询性能。

2. EXPLAIN 输出字段解析

EXPLAIN 命令的输出通常包含以下字段:

  • id: 查询的标识符。如果查询中有子查询或联合查询,每个子查询或联合查询都会有一个唯一的 id。
  • select_type: 查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。
  • table: 查询涉及的表名。
  • partitions: 查询涉及的分区。
  • type: 表的访问类型,如 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。
  • possible_keys: 可能使用的索引。
  • key: 实际使用的索引。
  • key_len: 使用的索引的长度。
  • ref: 显示索引的哪一列被使用了。
  • rows: 估计需要扫描的行数。
  • filtered: 表示查询条件过滤后的行数百分比。
  • Extra: 额外的信息,如 Using whereUsing index 等。

3. EXPLAIN FORMAT=JSON 的使用

EXPLAIN FORMAT=JSON 提供了更详细的执行计划信息,以 JSON 格式输出。这对于复杂的查询分析非常有用,因为它包含了更多的细节,如成本估算、访问路径等。

4. 使用 EXPLAIN 优化查询

通过分析 EXPLAIN 的输出,可以识别查询中的性能瓶颈。例如:

  • 如果 typeALL,表示进行了全表扫描,可能需要添加索引。
  • 如果 rows 值很大,表示查询可能需要优化。
  • 如果 Extra 列中有 Using filesortUsing temporary,表示查询可能需要优化以避免使用临时表或文件排序。

5. 示例

假设有一个表 users,并且你想查看查询 SELECT * FROM users WHERE age > 30 的执行计划:

输出可能如下:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE users NULL ALL NULL NULL NULL NULL 1000 10.00 Using where

从输出中可以看到,查询进行了全表扫描(type: ALL),并且没有使用索引(key: NULL)。为了优化这个查询,可以考虑在 age 列上添加索引。

纠错
反馈