执行计划EXPLAIN详解

什么是EXPLAIN?

EXPLAIN是MySQL提供的一条语句,用于详细展示MySQL如何执行一条SELECT语句。通过使用EXPLAIN,开发者可以看到MySQL如何处理查询及连接表,帮助我们诊断性能问题。

使用方法非常直接,只需在SELECT查询前加上EXPLAIN关键字。

EXPLAIN SELECT * FROM your_table;

EXPLAIN 列

执行EXPLAIN后,MySQL将返回一张表格,其中包含以下列:
在这里插入图片描述

  1. id

唯一标识SELECT子句或操作表的序号,id相同表示它们是一部分,id越大优先级越高。

  1. select_type

查询的类型,常见的值有以下几个。

  • SIMPLE:简单SELECT(不使用UNION或子查询)。
  • PRIMARY:查询中最外层的SELECT。
  • UNION:UNION中的第二个或后续的SELECT语句。
  • SUBQUERY:子查询中的第一个SELECT。
  • DERIVED:来自于派生表的SELECT(子查询在FROM列表中)。
  1. table

显示这一行的数据是关于哪个表的。

  1. partitions

显示查询是否使用了分区表。

  1. type

type列显示了MySQL解决查询的联接类型,通常从最好到最差如下:

  • system:表只有一行,等同于系统表。
  • const:表示通过索引一次就找到了,比如通过主键或者唯一索引查询。
  • eq_ref:唯一索引扫描,用于等值比较。
  • ref:非唯一索引扫描,返回匹配某个单独值的所有行。
  • fulltext:全文索引。
  • index_merge:表示使用了索引合并优化。
  • unique_subquery:在IN查询中使用了唯一索引。
  • index_subquery:IN查询,查询了索引的一部分。
  • range:索引范围扫描。
  • index:全索引扫描。
  • ALL:全表扫描。

一般type为index、all就可能需要进行优化。

  1. possible_keys

显示可能应用在这张表上的索引。

  1. key

实际使用的索引。如果没有选择索引,值是NULL。

  1. key_len

表示MySQL在索引里使用的字节数,越小越好。

  1. ref

显示列或常数与key一起被使用。

  1. rows

MySQL估计为了找到所需的行而必须检查的行数。

  1. filtered

表示返回结果的行占开始查找时行的百分比。

  1. Extra

包含MySQL解决查询的详细信息。

  • Using index:查询条件(where)使用了索引,查询列(select)使用了索引覆盖​(覆盖索引)

  • Using where:查询条件(where)包含未使用索引字段(没使用索引)

  • NULL:查询条件(where)使用了索引,查询列(select)需要回表(使用了索引但需要回表)

  • Using index condition:查询条件(where)使用了索引下推(使用了索引下推)

  • Using temporary:创建一张临时表来处理查询。(未使用索引,且需要创建临时表)

  • Using filesort:表示MySQL将使用一个外部索引排序来重新排序结果。(需要全表扫描排序)

如何利用EXPLAIN进行SQL调优?

  1. 查看type列

尽量避免ALL(全表扫描)和index(全索引扫描),将它们改进为range,ref。

  1. 检查possible_keys和key

确认是否有可能的索引未被使用。如果key列为空,或者没有利用到理想的索引,可能需要添加或修改索引。

  1. 分析key_len

key_len反映了索引的长度,确认是否可以通过缩短索引长度来减少扫描的数据量。

  1. 查看rows和filtered

如果rows数目特别大,可能需要优化查询或者增加索引来减少需要扫描的行数。filtered的百分比越高越好。

  1. 解读Extra列

"Using where"说明此时条件查询没有用到索引,需要建立索引结构
"Using temporary"表示使用了临时表,遇到这种情况可能需要优化查询结构。
"Using filesort"意味着MySQL将使用外部排序而不是索引顺序,通常需要优化排序操作,可以考虑联合索引。

上面列需要结合起来看,通过不断迭代和比对EXPLAIN的结果,您可以逐步优化查询,直到达到满意的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

儿童玩具行业分析:发展态势良好,市场空间不断拓展

玩具是有利于促进幼儿体、德、智、美的全面发展;符合儿童年龄特征,能满足其好奇心、好动和探索活动的愿望;造型优美,反映事物的典型特征;活动多变,有助于鼓励学习。中国玩具产品包括毛绒玩具、塑胶玩具、纸质玩具、电子玩具、木制玩具、金属玩…

虚拟机无法进入系统问题

概述 客户在华为云平台上创建了两台虚拟机并部署aarch64 V10 OS,2021-10-28其中一台虚拟机业务出现异常,运维重启虚拟机后系统进不去,左上角光标闪烁,接着重启另一台虚拟机同样起不来,现象一致。 分析 通过分析现场…

嵌入式Linux学习(3)——中断(Interrupt)子系统概念

目录 一. 中断概念与分类 1.1 中断分类 1.2 中断事件的处理流程 1.3 中断号(IRQ number) 1.4 中断源(Interrupt Source) 1.5 中断触发方式 二. 中断子系统架构 2.1 GIC 2.2 中断子系统架构 2.3 GIC与IP 2.3.1 典型GIC IP PLC390 GIC 400 GIC 500 REF 一. 中断概念与…

如何基于企业需求,又便宜又快地定制开发一套CRM客户管理系统?

如何基于企业需求,又便宜又快地定制开发一套CRM客户管理系统? 定制开发CRM客户管理系统是为了满足企业个性化需求而进行的,它可以帮助企业提高客户关系管理效率,提供更好的客户服务和实现精细化运营。本文将为大家介绍CRM定制开发…

TaxtArea中内嵌一张放松图片,该图片实现属性悬浮放大功能

TaxtArea中内嵌一张发送图片&#xff0c;该图片实现属性悬浮放大功能&#xff0c;离开还原效果&#xff0c;点击发送按钮后&#xff0c;发送图片变为loading&#xff0c; <div class"textarea-wrapper" ><a-textarearef"textArea"v-model.trim&q…

javafx可视化java编程入门教程

JavaFX是一个用于构建富客户端应用程序的开发框架。它提供了丰富的图形界面和多媒体功能,并且非常易于学习和使用。本文将带你从入门到精通JavaFX,让你了解如何使用JavaFX构建出色的界面和交互式应用程序。 第一部分:入门 JavaFX的入门非常简单。首先,你需要安装JavaFX开…

【C盘爆满系列二,留个笔记下次用】

C盘爆满系列二 这次遇到的c盘爆满的清空&#xff0c;始终未检测出具体原因1、系统休眠文件2、WinSxS 这次遇到的c盘爆满的清空&#xff0c;始终未检测出具体原因 使用这个扫描软件&#xff0c;扫描出了问题&#xff0c;主要占有存储的有两个大的方面。 1、系统休眠文件 因为…

借助图形控件Aspose.Tasks,在 C# 中将 XER 转换为 SVG

Primavera P6 是一款流行的项目管理软件&#xff0c;它使用XER 文件格式来存储项目数据。 SVG&#xff08;即可缩放矢量图形&#xff09;是一种流行的矢量图像格式&#xff0c;可用于为 Web 和打印应用程序创建可缩放图形。在某些情况下&#xff0c;我们可能需要以编程方式将 P…

唯众成功入选“全国基础软件安全可信行业产教融合体”理事单位

12月15日&#xff0c;全国基础软件安全可信行业产教融合共同体成立大会在武汉隆重召开。武汉唯众智创科技有限公司作为受邀嘉宾参加了成立大会。大会公布了共同体成员单位名单&#xff0c;唯众成功当选理事单位。 全国基础软件安全可信行业产教融合共同体 全国基础软件安全可信…

C++学习笔记(十五)

一、继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减…

ArkTS-一次开发,多端部署

展示 官方代码适配解读 官方代码&#xff1a;一次开发&#xff0c;多端部署-视频应用 解读 适配多端&#xff1a;根据屏幕大小来判断不同客户端&#xff0c;BreakpointSystem.ets中引入官方API获取 ohos.mediaqueryCommonConstants.ets定义好不同屏幕范围大小&#xff0c;供需…

【C++】map和set的模拟实现

map和set的模拟实现 插入模拟实现正向迭代器模拟实现插入完整实现map的[ ]接口模拟实现正向迭代器完整代码反向迭代器模拟实现 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 在前面几篇C的博客&#xff0c;讲过了二叉搜索树&#xff0c;AVL树&#xff0c;红黑…