【MySQL】执行计划EXPLAIN详解

MYSQL EXPLAIN执行计划详解 mysql查询优化器在基于成本和规则对一条查询语句进行优化后,会生成一条执行计划,这个执行计划展示了接下来执行查询的具体方式,比如多表连接的顺序是什么,采用什么访问方法来具体查询每个表等。设计mysql的大叔贴心地提供explain语句,可以让我们查看某个查询语句的具体执行计划。除了select开头的查询语句,其余的delete,insert,update,replace语句前面都可以加上explain这个词,用来查看这些语句的执行计划。 阅读详情

首先来看下EXPLAIN执行计划包含的信息:
在这里插入图片描述
其中最重要的字段有type、key、key_len、rows、Extra。
本篇接下来将对字段进行详细的分析。
分析之前先创建表格测试:

-- ----------------------------
-- Table structure for cps_commodity_info
-- ----------------------------
CREATE TABLE `cps_commodity_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` varchar(20) COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '商品skuId',
  `sku_name` varchar(100) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '商品名称',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  `is_on_top` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否置顶,0:不置顶,1:置顶',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`),
  KEY `idx_sku_name` (`sku_name`) USING BTREE COMMENT '商品名称索引',
  KEY `idx_sku_id` (`sku_id`) USING BTREE COMMENT '商品skuId索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='cps商品信息';

-- ----------------------------
-- Records of cps_commodity_info
-- ----------------------------
INSERT INTO `cps_commodity_info` VALUES ('1', '60469019380', '精装拉面', '36.69', '0', '2019-12-20 16:37:00', '2019-12-31 16:37:05', '0');
INSERT INTO `cps_commodity_info` VALUES ('2', '100003211179', '爆辣豆腐干', '22.66', '1', '2019-12-27 16:37:58', '2019-12-29 16:38:08', '0');
INSERT INTO `cps_commodity_info` VALUES ('3', '100003255505', '清洁控油洗面奶', '46.78', '0', '2019-12-28 16:39:11', '2019-12-28 16:39:19', '0');
INSERT INTO `cps_commodity_info` VALUES ('4', '55870972945', '圣诞节平安果', '16.52', '0', '2019-12-28 16:39:57', '2019-12-29 16:40:02', '0');
INSERT INTO `cps_commodity_info` VALUES ('5', '63618008655', '无线蓝牙耳机', '188.88', '1', '2020-01-01 16:40:40', '2020-01-01 16:40:49', '0');
-- ----------------------------
-- Table structure for cps_order_info
-- ----------------------------
CREATE TABLE `cps_order_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `order_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '订单Id',
  `sku_id` varchar(20) COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '商品skuId',
  `sku_name` varchar(100) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '商品名称',
  `fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '佣金',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_order_id` (`order_id`) USING BTREE,
  KEY `idx_sku_id` (`sku_id`) USING BTREE COMMENT '商品skuId索引'
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='cps订单信息';

-- ----------------------------
-- Records of cps_order_info
-- ----------------------------
INSERT INTO `cps_order_info` VALUES ('1', '2367887', '60469019380', '精装拉面', '3.66', '2020-01-23 15:27:11', '2020-01-23 15:27:15', '0');
INSERT INTO `cps_order_info` VALUES ('2', '2367888', '55870972945', '圣诞节平安果', '1.99', '2020-01-23 15:27:54', '2020-01-23 15:28:07', '0');
1. id

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

2. select_type

查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询

2.1、SIMPLE:简单的select查询,查询中不包含子查询或者union
2.2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
2.3、SUBQUERY:在select 或 where列表中包含了子查询
2.4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里
2.5、UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
2.6、UNION RESULT:从union表获取结果的select

在这里插入图片描述

3. table

表名,如果查询的时候给表设置了别名,将显示别名。

4. type

访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,好的sql查询至少达到range级别,最好能达到ref。

1、system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计。
2、const:表示通过索引一次就找到了,const常出现在primary key 或者 unique index。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const。
在这里插入图片描述
3、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。
4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体。
在这里插入图片描述
5、range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween、<、>、in等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引。
6、index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常为ALL块,应为索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)。
7、ALL:Full Table Scan,遍历全表以找到匹配的行。

5. possible_keys

查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用。

6. key

实际使用的索引,如果为NULL,则没有使用索引。
查询中如果使用了覆盖索引,则该索引仅出现在key列表中。

7. key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的。

8. ref

显示索引的哪一列被使用了。

9. rows

根据表统计信息及索引选用情况,匹配到满足条件的记录所需要扫描的行数,但不是精确值。

10.Extra
10.1 Using filesort

MySQL对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序”。
在这里插入图片描述

10.2 Using temporary

使用临时表保存中间结果,也就是说MySQL在对查询结果排序时使用了临时表,常见于ORDER BY和 GROUP BY。

10.3 Using index

表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高。如果同时出现Using where,表明索引被用来执行索引键值的查找。如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作。

覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
注意:
a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select *
b、如果将所有字段都建索引会导致索引文件过大,反而降低crud性能

10.4 Using where :

使用了WHERE过滤

小结

开发者应当对MySQL的执行计划有较全面的了解,这样才能在开发中发现问题并优化MySQL语句。关于MySQL的优化可以参看笔者的另一篇文章:
【MySQL】项目中常用的 18 条 MySQL 优化 打造高性能 SQL 语句

Mysql Explain执行计划详解 有了慢查询语句后,就要对语句进行分析。一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EPLATNEXPLAIN的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能。 阅读详情

相关推荐

MySQL EXPLAIN 使用详解与执行计划分析优化

EXPLAIN 是 MySQL 提供的 SQL 语句分析工具,可以显示 SQL 语句在执行时的执行计划,包括表的访问顺序、使用的索引、连接类型、扫描行数等。通过分析 EXPLAIN 的输出结果,可以帮助我们发现 SQL 性能瓶颈,进行有针对性的优化。

ljw714的专栏 1511

MySql优化,使用explain诠释sql语句优化

数据表结构 数据表数据量1200w, 开始之前普及一个概念: 表示查询所使用的访问类型,type的值主要有八种,该值表示查询的sql语句好坏,从最好到最差依次为:system>const>eq_ref>ref>range>index>ALL。 1.索引优化,在 字段(stu_name)上建立普通索引 查询结果时间快了一倍。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 3.

clown_silence的博客 990

mysql explain执行计划详解

前言 在日常开发中,经常会碰到mysql性能调优的问题,比如说某个功能一开始使用的时候,响应挺快,但是随着时间的推移,应用的访问量,数据量上去之后,发现越来越慢,甚至更糟糕,通常来说,排除了网络相关的因素之后,大多数情况下都是由sql问题引起的 因此,如何对查询的sql语句进行优化就成了关键所在,但是对不少开发同学来说,sql调优的范围太大,经常会显得无从下手,基于经验是一方面,另一方面需要对一条sql的底层执行原理有着较为深入的理解,这样才不会显得毫无头绪,其中,掌握explain关键字的使用对于mysq

congge 5642

Spark执行计划explain使用

这一部分,是加入了catalog验证表名和列名之后的执行计划,和上一部分的很像,但增加了表的相关信息,#号代表列的序号,L代表长整型整数。根据这些,我们可以看出,物理执行计划会去寻找表所在的文件位置,取出所需要的列,规约(预聚合),广播,join的方式,聚合的列等等信息。这一部分,是优化后的逻辑执行计划,加入了判断空值、自动过滤等功能,优化了逻辑执行过程。3.优化后的逻辑执行计划:== Optimized Logical Plan ==4.物理执行计划:== Physical Plan ==

Sunny的专栏 1109

Origin 2025b中文版安装全指南:避开乱码、水印与崩溃陷阱

Origin作为科研绘图领域的事实标准,其2025b版本首次官方支持简体中文UI,但安装远非‘下一步’即可完成。核心在于理解软件本体、语言包、许可证服务与系统区域设置四者间的耦合关系——尤其Windows非Unicode程序语言必须设为‘中文(简体,中国)’,否则必然触发坐标轴乱码、PDF文字方块等典型故障;而AI辅助拟合、内置Python 3.11等新特性,又依赖正确的字体链(如SimSun)与注册表强制加载(UILanguage=zh-CN)才能稳定启用。该版本广泛应用于材料科学、电化学、XRD/SEM

weixin_42548874的博客 1407

cesium加载天地图、OSM、谷歌底图

以上示例是加载矢量底图,若要加载影像或者其他只需要更换相应的url,在WebMapTileServiceImageryProvider中还要更改layer参数。url中’‘vec_w’,一些其他风格,基于CRAT渲染,两种方法效果差别不大。有两种方法加载天地图分别是。对应投影样式,具体可看。还要谷歌的一些卫星底图。

qq_44897914的博客 3000

explain分析sql

性能分析explain MySql Query Optimizer是MySql中专门负责优化select语句的优化器模块,主要功能:通过计算分析系统中收集到的系统信息,为客户端请求的Query提供他认为最优的执行计划(系统认为最优的数据检索方式,但不见得是DBA认为最优的,这部分最耗费时间) MySQL常见瓶颈 CPU: CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候 IO: 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候 服务器硬件的性能瓶颈:top,free, iostat和v..

徐哈哈的博客 610

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2940

Explain详解与索引最佳实践

Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 Explain分析示例 参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 1 示例表: 2 D

weixin_39585051的博客 567

基于mengzi-t5训练生成式模型

【代码】基于mengzi-t5训练生成式模型。

开卷有益 170

69、SAP数据库归档重做日志备份策略与工具详解

本文详细解析了SAP数据库归档重做日志备份的重要性及策略,介绍了SAP提供的备份工具brarchive及其配置和使用方法,探讨了BRBACKUP与BRARCHIVE的联合运行、一致在线备份、备用数据库备份场景以及备份策略的综合应用与优化。此外,还分析了备份过程中常见问题的解决方法、备份监控与评估流程、与第三方备份解决方案的集成方式,以及未来备份技术的发展趋势和应对策略。通过合理运用这些策略和工具,可以有效保障SAP数据库的安全性和可恢复性。

peace的博客 135

EXPLAIN:mysql 执行计划分析详解

在MySQL中,你可以使用EXPLAIN命令来生成查询的执行计划。EXPLAIN命令可以显示MySQL如何使用键来处理SELECT和DELETE语句,以及INSERT或UPDATE语句的WHERE子句。这对于了解查询的性能瓶颈以及优化查询非常有用。

程序吟游的博客 4754

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 504

MySQL EXPLAIN执行计划详解

MySQL EXPLAIN工具使用指南 EXPLAIN是MySQL的性能分析工具,用于查看SQL语句的执行计划。它能显示查询的执行细节,包括表读取顺序、操作类型、索引使用情况等。基本语法为EXPLAIN SELECT...,MySQL 8.0+还支持TREE/JSON格式和ANALYZE模式。

无论云泥意贯一 1580

YTM32B1M SDK解析31:软件I2C驱动详解

YTM32B1M微控制器软件I2C驱动解析 本文详细介绍了YTM32B1M微控制器中通过GPIO引脚模拟I2C总线的软件实现方案。核心内容包括: 驱动架构:采用swi2c_config_t配置结构体和swi2c_state_t状态结构体管理I2C参数 功能接口:提供初始化、数据传输(主/从模式)、底层控制等API 应用示例:包含基本配置、EEPROM读写、传感器数据采集、总线扫描等典型应用场景 优化建议:给出引脚选择、时序配置、错误处理等方面的最佳实践 该驱动在硬件I2C资源不足时提供可靠替代方案,支持标准

VehSwHwDeveloper的博客 158

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 831

【MySQL核心面试题】MySQL 核心 - Explain 执行计划详解!

欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,包含底层原理解析,带你冲破面试迷雾。

qq_45260619的博客 1232

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MySQL—— MySQL的执行计划详解(Explain)

文章目录1、MySQL执行计划的定义2、MySQL整个查询的过程3、如何启动执行计划4、Explain分析示例4、explain的 两个变种(我的版本是5.7)5、explain中的列5.1、id5.2、select_type5.3、table5.4、type5.5、possible_keys5.6、key5.7、key_len5.8、ref5.9、rows5.10、fitered5.11、Extra 1、MySQL执行计划的定义 在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语

zhouhengzhe的博客 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL EXPLAIN 查看执行计划详解

MySQL EXPLAIN命令是分析SQL查询性能的关键工具,它能展示查询执行计划、索引使用情况、连接方式和预估行数等信息。主要关注type列(访问类型,从最优system到最差ALL)、key列(实际使用的索引)、rows列(预估扫描行数)和Extra列(额外信息如是否使用临时表或文件排序)。优化目标是让type达到range级别以上,避免全表扫描,并尽可能使用覆盖索引(Extra显示Using index)。通过EXPLAIN分析可以识别性能瓶颈,如缺少索引、低效连接或排序问题,从而针对性优化查询。

M_Reus_11的博客 1286

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【MySQL系列】- Explain执行计划详解

EXPLAIN关键字是MySQL性能分析神器;可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。

记录总结工作过往 2174

MySQL优化——Explain分析执行计划详解

在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的 SQL 语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化,本章将详细介绍在 MySQL中优化 SQL 语句的方法。当面对一个有 SQL 性能问题的数据库时,我们应该从何处入手来进行系统的分析,使得能够尽快定位问题 SQL 并尽快解决问题。

爱吃鸡腿的明仔 2814

详解Mysql执行计划explain

1、MySQL语法 MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个”EXPLAIN”即可。 默认情况下Mysql的profiling是关闭的,所以首先必须打开profiling set profiling="ON"mysql> show variables like "%profi%"; ------------------------ ------- | Variabl...

Hello World 2188

mysql 执行计划工具_MySQL执行计划分析工具EXPLAIN用法详解

对于DBA来讲熟悉SQL的执行计划分析技巧对于快速定位数据库性能问题至关重要,下面简单介绍一下如何分析MySQL的执行计划。一、EXPLAIN用法详解:EXPLAIN SELECT ……变体:1.EXPLAINEXTENDEDSELECT……将执行计划“反编译”成SELECT语句,运行SHOWWARNINGS可得到被MySQL优化器优化后的查询语句2.EXPLAINPARTITI...

weixin_28789499的博客 441

MySQL 优化:Explain 执行计划详解

上边只是简单介绍了下Explain执行计划各个列的含义,了解它不仅仅是要应付面试,在实际开发中也经常会用到。比如对慢SQL进行分析,如果连执行计划结果都不会看,那还谈什么SQL优化呢?

程序员高级码农的博客 1088
上一篇: 【Java基础】Java中获取系统当前时间:System.currentTimeMillis()和System.nanoTime()
下一篇: 【MySQL】MySQL技术内幕:深入理解 InnoDB 和 MyISAM 存储引擎
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值