MySQL EXPLAIN关键字
MySQL EXPLAIN 关键字用于获取关于如何执行MySQL数据库中的查询的信息。 它与DESCRIBE语句等效。 在实践中,DESCRIBE关键字提供表结构信息,而EXPLAIN关键字提供查询执行计划。 它是一个理解和优化MySQL中查询的强大工具,但开发人员很少使用它。
它可以与INSERT,SELECT,DELETE,UPDATE和REPLACE查询一起使用。 从 MySQL 8.0.19及更高版本 开始,它还可以与TABLE语句一起使用。当我们在查询中使用此关键字时,它将处理语句并提供执行计划中每个步骤的信息,例如如何连接表,表的顺序,估计的分区等。 它返回解释执行计划的每个部分和执行顺序的单个或多个行。
让我们通过一个示例来了解它的用法。
示例
假设我们在示例数据库中有一个名为 “student_info” 和 “orders” 的表,它包含以下数据:
如果我们想展示一个 SELECT语句 的执行计划,我们可以使用以下查询:
mysql> EXPLAIN SELECT * FROM student_info;
输出:
此查询会生成以下信息:
有时候我们不想扫描整个表格。在这种情况下,我们需要使用索引来根据指定的条件查看信息。执行以下语句在student_info表中创建一个索引:
mysql> create index student_id_index on student_info(stud_id);
如果索引成功创建,则会产生以下输出:
现在,执行以下查询以避免完全扫描数据库中的表:
mysql> EXPLAIN SELECT * FROM student_info WHERE stud_id = 1;
它将会产生如下图像的输出:
EXPLAIN SELECT s. stud_name, s.phone, orders.order_date, orders.prod_name
FROM student_info AS s
JOIN orders ON (s.stud_id = orders.order_id)
WHERE s.stud_name = 'Barack';
输出:
执行后,我们将获得如下图像所示的输出:
在上面的输出中,我们可以看到两个表的select_type都是SIMPLE。两个表之间存在一对多的关系。student_info表的主键被用作orders表的外键。因此,第二行的possible_keys值是order_id。第一行中student_info表的filtered值是12.50%,因为’Barack’是该表的第四个条目。第二行中orders表的filtered值是100%。这是因为检索数据时必须检查orders表的所有值。
在SELECT查询中使用UNION ALL操作符的EXPLAIN关键字
UNION ALL是一种操作符,在使用SELECT查询时,它返回与相关表中的重复项匹配的所有列值。下面的语句展示了在student_info和orders表之间使用 UNION ALL 操作符的EXPLAIN输出。
EXPLAIN SELECT stud_id as ID FROM student_info
UNION ALL
SELECT order_id as ID FROM orders;
输出:
它将产生如下输出,我们可以看到select_type的值为UNION,而Extra列的值为索引:
MySQL EXPLAIN关键字的限制
以下是MySQL中EXPLAIN关键字的最常见限制:
- EXPLAIN无法提供有关触发器、存储函数或UDF将如何影响查询的任何信息。
- EXPLAIN关键字无法用于存储过程。
- 它不会告诉你MySQL在查询执行过程中进行的优化。
- 它生成的估计统计信息可能非常不准确。
- 它不会提供有关查询执行计划的所有信息。
MySQL EXPLAIN ANALYZE
它是用于查询的性能分析工具,显示MySQL在查询执行过程中花费时间和原因的信息。它会计划查询,对其进行仪器化,并在执行计划的各个点上计算行数和测量时间。执行完成后,它将打印出计划和测量结果,而不是查询结果。
示例:
EXPLAIN ANALYZE SELECT s. stud_name, s.phone, orders.order_date, orders.prod_name
FROM student_info AS s
JOIN orders ON (s.stud_id = orders.order_id)
WHERE s.stud_name = 'Barack';
输出: