logo图片
MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
MySql差异性

MySQL EXPLAIN

EXPLAIN关键字用于 获取有关我们的SQL数据库如何在MySQL中执行查询的信息。它是DESCRIBE语句的同义词。实际上,DESCRIBE关键字提供表结构信息,而EXPLAIN关键字提供查询执行计划。它是了解和优化 MySQL 中的查询的强大工具,但开发人员很少使用它。
它可以与 INSERT , SELECT ,删除, UPDATE 和替换查询。从 MySQL 8.0.19和更高版本开始,它还可以使用TABLE语句。当我们在查询中使用此关键字时,它将处理该语句并提供有关执行计划中每个步骤的信息,例如表的连接方式,表的顺序,估计的分区等。它返回单行或多行来解释每个行执行计划的一部分和执行顺序。
让我们借助示例来理解它。

示例

假设我们在示例数据库中有一个名为" student_info "和" orders "的表,其中包含以下数据:
MySQL EXPLAIN
MySQL EXPLAIN
如果我们想显示 SELECT语句的执行计划,我们可以使用以下查询:
mysql> EXPLAIN SELECT * FROM student_info;
输出:
此查询产生以下信息:
MySQL EXPLAIN
有时我们不想扫描整个表。在这种情况下,我们需要使用INDEX根据指定条件查看信息。执行以下语句在student_info表中创建索引:
mysql> create index student_id_index on student_info(stud_id);
如果成功创建索引,它将产生以下输出:
MySQL EXPLAIN
现在,执行以下查询以避免对数据库进行完整的表扫描:
mysql> EXPLAIN SELECT * FROM student_info WHERE stud_id = 1;
它将产生如下图像的输出:
MySQL EXPLAIN
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';
输出:
执行后,我们将得到如下图所示的输出:
MySQL EXPLAIN
在上面的输出中,我们看到两个表的select_type是SIMPLE。两个表都遵循一对多关系。 student_info表的主键用作orders表的外键。因此,第二行的possible_keys值为order_id。对于student_info表,第一行的过滤值为12.50%,因为" Barack"是该表的第四项。对于订单表,第二行中的过滤值为100%。这是因为必须检查订单表的所有值才能检索数据。

使用UNION ALL运算符的SELECT查询中的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关键字限制

以下是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'; 
输出:
MySQL EXPLAIN
昵称: 邮箱:
Copyright © 2020 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4