MySQL EXPLAIN

2025年3月17日 | 阅读 3 分钟

EXPLAIN 关键字用于获取有关 SQL 数据库如何在 MySQL 中执行查询的信息。它是 DESCRIBE 语句的同义词。在实践中,DESCRIBE 关键字提供表结构信息,而 EXPLAIN 关键字提供查询执行计划。它是理解和优化 MySQL 中查询的强大工具,但开发人员很少使用它。

它可以与 INSERTSELECTDELETEUPDATEREPLACE 查询一起使用。从MySQL 8.0.19 及更高版本开始,它还可以与 TABLE 语句一起使用。当我们在查询中使用此关键字时,它将处理语句并提供执行计划中每个步骤的信息,例如表如何连接、表的顺序、估计的分区等。它返回一行或多行,解释执行计划的每个部分以及执行顺序。

让我们借助一个例子来理解它。

示例

假设我们在示例数据库中有一个名为“student_info”和“orders”的表,其中包含以下数据

MySQL EXPLAIN
MySQL EXPLAIN

如果我们想显示 SELECT 语句的执行计划,我们可以使用如下查询

输出

此查询将产生以下信息

MySQL EXPLAIN

有时我们不想扫描整个表。在这种情况下,我们需要使用 INDEX 来根据指定条件查看信息。执行以下语句在 student_info 表中创建索引

如果索引创建成功,将产生以下输出

MySQL EXPLAIN

现在,执行以下查询以避免数据库中的完整表扫描

它将产生如下图片所示的输出

MySQL EXPLAIN

输出

执行后,我们将获得如下图片所示的输出

MySQL EXPLAIN

在上面的输出中,我们可以看到两个表的 select_type 都是 SIMPLE。两个表都遵循一对多的关系。student_info 表的主键用作 orders 表的外键。因此,第二行的 possible_keys 值是 order_id。student_info 表的 filtered 值是 12.50%,因为“Barack”是该表的第四个条目。orders 表的 filtered 值是 100%,这是因为必须检查 orders 表的所有值才能检索数据。

带 UNION ALL 运算符的 SELECT 查询中的 EXPLAIN 关键字

UNION ALL 是一个运算符,在使用 SELECT 查询时,它会返回来自相关表的具有重复项的所有匹配列值。以下语句显示了在 student_info 和 orders 表之间使用 UNION ALL 运算符的 EXPLAIN 输出。

输出

它将产生以下输出,其中我们可以看到第二行的 select_type 值是 UNION,Extra 列的值是 index

MySQL EXPLAIN

MySQL EXPLAIN 关键字的局限性

以下是 MySQL 中 EXPLAIN 关键字最常见的限制

  • EXPLAIN 不提供有关触发器、存储函数或 UDF 如何影响我们查询的任何信息。
  • EXPLAIN 关键字不能用于存储过程。
  • 它不会告诉你 MySQL 在查询执行期间会进行哪些优化。
  • 它产生的估计统计数据可能非常不准确。
  • 它不产生关于查询执行计划的每个信息。

MySQL EXPLAIN ANALYZE

它是一种查询分析工具,显示有关 MySQL 在查询执行中花费时间的位置以及原因的信息。它将计划查询、对其进行检测并执行它,同时在执行计划的各个点计算行数和测量花费的时间。执行完成后,它将打印计划和测量结果,而不是查询结果。

示例

输出

MySQL EXPLAIN
下一个主题MySQL Sequence