MySQL数据库 — Explain命令

news2024/11/24 7:56:12

EXPLAIN 命令在 MySQL 查询优化中发挥了重要作用。通过 EXPLAIN 的输出,可以获取有关查询执行计划的详细信息,从而有助于优化和调试查询。不过,它也有一定的局限性。

使用Explain

EXPLAIN 语句通过在查询前加上 EXPLAIN 关键字来展示查询的执行计划,而不是实际执行查询。这让我们能够了解查询是如何被优化器处理的,查看各个步骤的详细信息,包括访问的表、使用的索引、行数估计等,从而帮助我们优化查询性能。

基本 EXPLAIN 用法

假设我们有一个名为 employees 的表,如下所示:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    salary DECIMAL(10, 2),
    INDEX (department_id)
);

我们可以用 EXPLAIN 来查看一个简单查询的执行计划:

EXPLAIN SELECT * FROM employees WHERE department_id = 5;

这将显示关于如何访问 employees 表的详细信息,包括使用的索引和扫描的行数等。

使用 EXPLAIN 进行连接查询

假设还有一个名为 departments 的表,结构如下:

CREATE TABLE departments (
id INT AUTO_INCREMENT PRIMARY KEY,
department_name VARCHAR(100)
);

我们要查询 employees 和 departments 表的连接信息,可以使用如下 SQL 查询:

EXPLAIN SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 50000;

这将展示连接操作的执行计划,包括每个表的访问方法和连接的具体细节。

使用 EXPLAIN 分析复杂查询

考虑一个复杂的查询,涉及子查询和排序操作:

EXPLAIN SELECT name
FROM employees
WHERE salary > (
    SELECT AVG(salary) FROM employees
)
ORDER BY salary DESC;

通过 EXPLAIN 可以查看这个查询在执行过程中使用了哪些操作,如是否使用了临时表、文件排序等。

使用 EXPLAIN ANALYZE

在 MySQL 8.0.18 及更高版本中,EXPLAIN ANALYZE 提供了执行计划的实际执行统计信息,而不仅仅是估算信息:

EXPLAIN ANALYZE SELECT * FROM employees WHERE department_id = 5;

EXPLAIN ANALYZE 会展示实际执行的时间和行数,提供比 EXPLAIN 更详细的性能数据。

使用 EXPLAIN 分析 INSERT 查询

EXPLAIN 通常用于 SELECT 查询,但也可以用来分析 INSERT 操作:

EXPLAIN INSERT INTO employees (name, department_id, salary) VALUES ('Alice', 5, 70000);

Explain有两个主要的变种

  • EXPLAIN EXTENDED:提供了比普通 EXPLAIN 更详细的信息,包括一个“逆向编译”的查询语句,可以通过 SHOW WARNINGS 查看。这有助于理解查询优化器如何处理和优化查询。
  • EXPLAIN PARTITIONS:用于显示查询将访问的分区,如果查询涉及分区表的话。

不过,EXPLAIN 也有一些局限性:

  • 不会展示触发器、存储过程或用户定义函数(UDF)对查询的影响。
  • 无法直接支持存储过程,但可以通过提取查询来进行分析。
  • 不会揭示 MySQL 在查询执行过程中所做的具体优化。
  • 对于一些操作(如内存排序和临时文件使用),可能会使用相同的描述词,容易造成误解。
  • 对于复杂的子查询,EXPLAIN 可能执行子查询,并将其结果存储在临时表中,可能会影响到外层查询的优化结果。

Explain中的列

id 列:

功能:标识查询中的每一行的执行顺序。数字越大优先级越高。NULL 表示该行是最终结果集的一部分,不需要进一步查询。

select_type 列:

功能:描述查询的复杂程度。

  • SIMPLE:简单查询,没有子查询或 UNION。
  • PRIMARY:外层的主查询,可能包含 UNION 或子查询。
  • UNION:UNION 连接的查询中的第二个及以后的查询。
  • DEPENDENT UNION:受外部查询影响的 UNION 查询。
  • UNION RESULT:UNION 的结果集。
  • SUBQUERY:非 FROM 子句中的子查询。
  • DEPENDENT SUBQUERY:受外部查询影响的子查询。
  • DERIVED:FROM 子句中的子查询,也叫派生表。

table 列:

功能:显示正在访问的表名或别名。如果涉及临时表或 UNION 结果集,会显示为 <derived N> 或 <union M,N>。

type 列:

功能:显示访问表的类型,从最优到最差排序。

  • system:表只有一行数据或为空表。
  • const:使用唯一索引或主键,返回唯一记录。
  • eq_ref:连接表时使用主键或唯一索引,返回唯一行。
  • ref:等值查找,但不要求唯一性。
  • fulltext:全文索引查找。
  • ref_or_null:包括 NULL 值的等值查找。
  • unique_subquery:子查询返回唯一值。
  • index_subquery:使用索引的子查询。
  • range:范围扫描,例如 >, <, BETWEEN。
  • index_merge:使用多个索引的交集或并集。
  • index:全索引扫描。
  • all:全表扫描。

possible_keys 列:

功能:列出查询可能使用的索引。这个列表是优化过程早期创建的,因此有些罗列出来的索引有可能后续是没用的。

key 列:

功能:实际使用的索引。如果查询涉及多个索引,这里可能列出多个索引。

key_len 列:

功能:显示用于处理查询的索引长度。对于多列索引,只计算实际使用的列。

ref 列:

功能:显示索引的使用情况,如常数值、连接字段或函数。

rows 列:

功能:估算的扫描行数。这是优化器的估算值,不一定是精确值。

extra 列:

功能:提供额外的执行信息。

  • distinct:查询使用了 DISTINCT 关键字。这表示数据库在返回结果时需要去除重复的记录。
  • no tables used:查询不涉及任何表,例如直接从 dual 表中查询,通常用于计算常量表达式。
  • using filesort:数据库在执行排序操作时不能利用索引,因此需要额外的文件排序。这通常发生在使用 ORDER BY 或 GROUP BY 语句时。
  • using index:查询只通过索引就能获得所有需要的数据,而不需要回表操作。这通常意味着索引包含了所有需要的列。
  • using join buffer (block nested-loop):数据库使用了块嵌套循环连接(BNL)。这是一个在连接表时的优化策略,通常用于处理较大的数据集。
  • using join buffer (batched key access):数据库使用了分批键访问(BKA)优化策略。这种方法减少了对内表的多次循环,并提高了连接操作的效率。
  • using sort_union:在处理 UNION 操作时,数据库先进行排序合并,然后再返回结果。这种方法在处理 UNION 查询时较为常见。
  • using union:数据库使用了 UNION 操作,并从各个条件的结果集中获取并集。
  • using sort_intersection:在处理多个条件的 INTERSECT 操作时,数据库先对结果进行排序并计算交集,然后返回结果。
  • using temporary:数据库在执行查询时使用了临时表来存储中间结果。这些临时表可能存储在内存中或磁盘上。
  • using where:数据库从存储引擎返回的记录中,部分记录需要在服务器层进行进一步的过滤以满足查询条件。
  • firstmatch(tb_name):这是 MySQL 5.6 及之后版本引入的优化特性,表示在处理包含 IN 子查询的查询时,如果子查询的内表数据量较大,可能会使用此优化策略。
  • loosescan(m..n):这是 MySQL 5.6 及之后版本引入的优化特性,表示在处理 IN 类型的子查询时,查询可能会返回重复记录,数据库会进行优化处理。
  • select tables optimized away:某些表由于优化而被忽略。例如,当查询只涉及常量或简单表达式时,数据库可能会优化掉不必要的表。

filtered 列:

功能:filtered 列显示了在服务器层进行过滤后,记录的比例(百分比),通常在使用 EXPLAIN EXTENDED 时出现。它表示从存储引擎中检索的数据中有多少符合查询条件。这个信息有助于了解在执行查询时,存储引擎返回的记录数量与实际需要的记录数量之间的差距,从而优化查询性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正则表达式三板斧

推荐练习网站&#xff1a;https://regex101.com/ 解释一下: 1、最常用的就是[]&#xff0c;表示匹配任意字符&#xff0c;[]中所有的变量只需要输入一次&#xff08;比如搜索三个点…&#xff0c;只需要输入[.]即可&#xff09; 2、*表示>0次&#xff0c;表示>1次&#x…

计算机毕业设计选题推荐-推拿知识互动平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

大白话!解析大模型原理!

LLM的工作原理对大多数人来说是个谜。虽然它们本质上在于“预测下一个词”&#xff0c;并需要大量文本进行训练&#xff0c;但具体细节往往令人困惑。原因在于这些系统独特的开发方式&#xff1a;**基于数十亿词汇训练的神经网络&#xff0c;不同于传统的人类编写的软件。**尽管…

SpringCache源码解析(三)——@EnableCaching

一、源码阅读 让我们进行源码阅读把。 1.1 阅读源码基础&#xff1a; Import(xxx.class)里的类可以有两种类&#xff1a; ImportSelector接口的实现类&#xff1b;ImportBeanDefinitionRegistrar接口的实现类&#xff1b; 两种接口简介&#xff1a; ImportSelector接口&am…

如何在算家云搭建Open-Sora1.0

一、模型介绍 2024 年 3 月 18 日&#xff0c;Colossal-AI 团队发布了 Open-Sora 1.0 项目&#xff0c;该项目是一个全面开源的视频生成模型项目&#xff0c;项目旨在高效制作高质量视频&#xff0c;并使所有人都能使用其模型、工具和内容。 模型架构 &#xff1a; Open-Sor…

ubuntu20.04 编译vtk 9.3.1+vtkDicom+GDCM 3.0.24

1 下载vtk源码 链接地址如下&#xff1a; Download | VTK 使用cmake-gui编译&#xff08;如何安装使用&#xff0c;查看前两篇文章&#xff09;&#xff0c;运行命令&#xff1a; cmake-gui 如下图所示&#xff0c;选择源码目录和build目录&#xff1a; 勾选 BUILD_SHARED…

基于SpringBoot+Vue+MySQL的志愿服务管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会对志愿服务需求的日益增长&#xff0c;传统的志愿服务管理方式已难以满足高效、透明、精准的管理需求。为提升志愿服务组织的运营效率&#xff0c;优化资源配置&#xff0c;增强志愿者参与度和满意度&#xff0c;开发基…

项目启动 | 盘古信息携手晶捷电子,开启数字化生产管理新纪元

随着智能制造技术的不断成熟与普及&#xff0c;一个全新的制造业时代已经到来&#xff0c;智能制造已成为推动全球制造业转型升级的重要引擎。在日新月异的市场环境中&#xff0c;传统制造业更需加快转型升级的步伐&#xff0c;以智能化、精细化的生产模式&#xff0c;实现生产…

昆仑联通8000万补流全砍:曾分红近亿,应收账款周转率连年下滑

《港湾商业观察》廖紫雯 日前&#xff0c;北京昆仑联通科技发展股份有限公司&#xff08;以下简称&#xff1a;昆仑联通&#xff09;拟冲刺北交所&#xff0c;保荐机构为东方证券。 2023年6月29日&#xff0c;昆仑联通于上交所递交招股书&#xff0c;拟冲刺沪市主板&#xff…

混淆矩阵与 ROC 曲线:何时使用哪个进行模型评估

必须在机器学习和数据科学中评估模型性能&#xff0c;才能提出一个可靠、准确和高效的模型来进行任何类型的预测。一些常见的工具是 Confusion Matrix 和 ROC Curve。两者具有不同的用途&#xff0c;确切地知道何时使用它们对于稳健的模型评估至关重要。在这篇博客中&#xff0…

【nginx】转发配置、漏洞整改

转发配置 常见的接口调用配置&#xff1a; location /com_api/ {proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $http_host;proxy_pass http://后端服务IP:后端服务端口号/; }若转发调不通时&#xff08;常出现在调用第三方系统时&#xff09;&#xff0c;…

大数据 - OLAP与OLTP的区别

前言 联机事务处理OLTP&#xff08;on-line transaction processing&#xff09;和 联机分析处理OLAP&#xff08;On-Line Analytical Processing&#xff09;。 OLTP&#xff0c;主要是面向传统的“增删改查”事务系统&#xff0c;数据大都是以实体对象模型来存储数据&#…

Java设计模式—面向对象设计原则(二) --------> 里氏代换原则 LSP (完整详解,附有代码+案列)

文章目录 里氏代换原则3.2.1 概述3.2.2 改进上述代码 里氏代换原则 3.2.1 概述 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则&#xff1a;任何基类可以出现的地方&#xff0c;子类一定可以出现。通俗理解&#xff1a;子类可以扩展父类的功能&#xff0c;但不能…

快速同步与问题解决:每日站立会议的实用指南

每日站会不管是在大型企业中&#xff0c;还是在中小型企业中都是每日必备的一种晨会。但并不是所有的企业都能够正确使用每日站会&#xff0c;较多的企业在每日站会中总会偏离每日站会的使用目的&#xff0c;从而变成了一个偏向于教育批评的会议。本篇文章中&#xff0c;让我们…

4WRA6E07-2X/G24N9K4/VL配套HE-SP2比例放大器

比例方向阀由直流比例电磁铁与液压阀两部分组成。通过BEUEC比例放大器对控制信号进行功率放大后&#xff0c;电磁铁产生与电流成比例的力或位移&#xff0c;移动阀芯位置&#xff0c;实现流量和流向的精确控制。比例方向阀能实现流量和方向的连续且精确的控制&#xff0c;尤其是…

企业如何“向内求”, 挖出更多净利润?

未来的财务部门将是一个“主导“部门&#xff0c;成为业务的翻译官&#xff0c;成为业财融合的引领者&#xff0c;引领企业走在最适合自己的财务数智化转型道路上。 作者|思杭 出品|产业家 收入增速放缓、营收下滑、消费意愿降低&#xff0c;这些也许是近半年在各种企业财…

14款用于创建和销售数字产品的工具(专家推荐)

创建和销售数字产品是获得被动收入并向全球观众分享您的专业知识的绝佳方式。但您需要合适的工具来实现这一目标。否则&#xff0c;您可能会在复杂的系统上浪费时间和金钱&#xff0c;最终无法获得预期的效果。 在WPBeginner&#xff0c;我们已经创建数字产品超过十年&#xf…

[FireshellCTF2020]Caas1

知识点&#xff1a; 1.文件包含 2.#include " " 预处理报错 进入页面发现是让我么输入code然后他去处理&#xff0c;那就输一下试试. 它报错了&#xff0c;可以看出这是个C语言的报错&#xff0c;那么传入一下C语言代码. #include <stdio.h>int main() {prin…

力扣最热一百题——二叉树的直径

目录 题目链接&#xff1a;543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;深度优先搜索 实现思路&#xff1a; 关键点&#xff1a; Java写法&#xff1a; 运行时间 C写法&#xff1a; 运行时间 总结…

优思学院|精益工程师是做什么的? 前途好吗?

如果你有经常留意招聘网站&#xff0c;你或者会偶尔看到精益工程师这个职位&#xff0c;事实上精益工程师这个岗位不多&#xff0c;但却有很多人会觉得精益工程师前途无限&#xff0c;到底为什么呢&#xff1f; 精益工程师的职责主要围绕着帮助企业减少浪费、优化流程、提升效…