MySQL之explain执行计划

一、explain作用

MySQL的EXPLAIN命令是开发者经常使用的一个强大的分析工具,帮助开发者了解查询的性能瓶颈和优化方向。

二、使用方法

只需要在要执行的sql语句前加explain关键字即可,如下

mysql> explain select * from user where id >60;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | user  | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |   40 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

三、explain执行结果分析

id:表示查询的顺序,数字越小优先级越高。

select_type:表示查询的类型

  • SIMPLE:表示简单查询,即不包含子查询或 UNION 操作的查询。

  • PRIMARY:表示主查询,即外层查询。

  • SUBQUERY:表示子查询中的第一个 SELECT 语句。

  • DERIVED:表示派生表的查询,即子查询中除第一个 SELECT 语句之外的其他 SELECT 语句。

  • UNION:表示 UNION 操作的结果集。

  • UNION RESULT:表示 UNION 操作的结果集,与 UNION 类似,但只能用于 MySQL 数据库。

  • TABLE:表示查询结果是一个表,而不是一个具体的值。

例如:如果发现查询的类型一个简单的查询,可以考虑添加索引来提高查询性能;如果发现查询包含子查询,那么可以考虑将子查询转换为连接查询来提高性能。总之,select_type 字段的分析对于优化 SQL 查询具有重要的指导意义。

table:表示查询涉及的表名。

table 字段表示查询涉及的表名。在 SQL 查询中,可能会涉及到多个表的连接操作,而 table 字段则用于显示这些表的名称。

+----+-------------+-------+------+---------------+------+---------+------+------+----------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra    |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+
|  1 | SIMPLE      | users | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL     |
|  1 | SIMPLE      | orders| ref  | user_id       | user_id | 4       | func |    1 | NULL     |
+----+-------------+-------+------+---------------+------+---------+------+-----

type:表示数据访问类型,如 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。不同的访问类型对性能的影响不同,通常 ALL 类型的访问性能最差,而 index 和 range 类型的访问性能较好。

  • ALL:表示全表扫描,即需要遍历整个表来查找数据。这种类型的查询性能最差,通常需要优化。

  • index:表示使用索引进行访问,不需要遍历整个表。这种类型的查询性能较好,但需要注意索引的选择和使用。

  • range:表示使用范围查询,即在索引上进行范围查找。这种类型的查询性能较好,但需要注意索引的选择和使用。

  • ref:表示使用非唯一索引进行等值查询。这种类型的查询性能较好,但需要注意索引的选择和使用。

  • eq_ref:表示使用唯一索引进行等值查询。这种类型的查询性能最好,因为只需要查找一个记录即可。

  • const、system:这两种类型的查询性能都非常好,因为它们只需要查找一个常量或者系统表中的记录。

  • NULL:表示使用 IS NULL 或 IS NOT NULL 进行查询。这种类型的查询性能较好,但需要注意索引的选择和使用

    例如,如果发现查询使用了 ALL 类型的访问,那么可以考虑添加索引来提高查询性能;如果发现查询使用了 Using filesort,那么可以考虑调整排序方式以提高性能

possible_keys:表示可能使用的索引。​​​​​​​

mysql> explain select * from user where age >18 and sex="男";
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | user  | NULL       | ALL  | idx_age_sex   | NULL | NULL    | NULL |  100 |    49.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

key:表示实际使用的索引。如果实际使用的索引与可能使用的索引不一致,可能需要调整索引以提高查询性能。​​​​​​​

mysql> explain select * from user where age = 18;
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | ref  | idx_age_sex   | idx_age_sex | 5       | const |    2 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

key_len:表示使用的索引的长度。长度越短,表示索引越高效。

key_len 的值反映了在执行查询时,所使用的索引中涉及到的字段的总长度。这个长度越短,通常意味着索引的效率越高,因为数据库在查找索引时需要读取的数据量更少。在联合索引中,key_len 还可以帮助我们判断有多少列被用于索引查找。如果 key_len 较短,可能意味着只有部分列被用作过滤条件,而不是所有列都被使用。

key_len 的指导意义在于帮助我们了解索引的使用效率和查询的性能瓶颈。

  1. 优化索引结构:如果发现 key_len 过长,可能需要考虑调整索引结构,比如减少联合索引中的列数,或者选择更短的列作为索引。

  2. 评估查询性能:较短的 key_len 通常意味着查询性能更好,因为它减少了磁盘I/O操作的次数。相反,较长的 key_len 可能意味着查询需要更多的磁盘读取,从而影响性能。

  3. 分析索引覆盖:通过 key_len 我们可以推断出是否发生了索引覆盖读(covering index),即查询所需的所有数据都包含在索引中,而不需要回表查询原始数据行。

ref:提供了关于如何利用索引进行查找的信息。

  •  const: 表示该列被用作常量比较,即该列的值在索引中是唯一的或者是一个范围的最左端点。

  • eq_ref: 表示使用等于条件(=)来查找唯一索引的列,通常用于主键或唯一索引的查找。

  • range: 表示使用范围条件(如 <, >, BETWEEN)来查找索引列。

  • ref: 表示非唯一索引的列被用作查找条件,这通常是普通的比较操作,比如 = 或 <>。

  • fulltext: 表示使用全文索引进行查找。

  • ref_or_null: 类似于 ref,但是允许索引列的值为 NULL。

  • index_merge: 表示查询优化器使用了多个单个索引的合并来执行查询。

  • unique_subquery: 表示在子查询中使用了唯一索引。

  • index_subquery: 表示在子查询中使用了非唯一索引。

  • range_check: 表示对一个范围条件进行了检查,这通常发生在多列索引的情况下,其中一些列使用了范围条件,而其他列则没有。

ref 字段显示为 ALL 或 USING where,这意味着查询没有使用索引,而是进行了全表扫描

rows:表示估计需要检查的行数。这个数字越大,表示查询性能可能越低。

rows 字段表示查询执行过程中预计需要扫描的行数。这个值是一个估计值,用于帮助我们评估查询的性能和优化查询。较高的 rows 值通常意味着查询性能较差,因为需要读取更多的数据行。相反,较低的 rows 值通常意味着查询性能较好,因为只需要读取较少的数据行。

Extra:表示额外的信息,如 Using index(使用覆盖索引)、Using filesort(使用文件排序)等。这些信息可以帮助我们了解查询的性能瓶颈并进行优化。

  • Using index: 表示查询使用了覆盖索引(covering index),即查询所需的所有数据都包含在索引中,而不需要回表查询原始数据行。

  • Using where: 表示查询使用了 WHERE 子句进行过滤,但并没有使用到索引。这通常意味着查询进行了全表扫描。

  • Using filesort: 表示查询需要进行排序操作,这通常发生在 ORDER BY 子句中。如果需要排序的数据量较大,可能会影响查询性能。

  • Using temporary: 表示查询需要创建临时表来存储中间结果。这通常发生在复杂的查询或聚合操作中,如 GROUP BY 或 DISTINCT。

  • Using index condition: 表示查询使用了索引条件推送(Index Condition Pushdown),即在索引层就进行了条件过滤,减少了需要回表的数据行数。

  • Using intersect(...): 表示查询使用了集合交操作,这通常发生在多表查询中,如 JOIN 或 UNION。

  • Using union(...): 表示查询使用了集合并操作,这通常发生在多表查询中,如 JOIN 或 UNION。

  • Using sort_union(...): 表示查询使用了排序合并连接(Sort-Merge Join),这通常发生在多表查询中,特别是在没有合适索引的情况下。

  • Using where; Using index: 表示查询既使用了 WHERE 子句进行过滤,又使用了覆盖索引。

  • Using index for group-by: 表示查询使用了索引进行分组操作,这通常发生在 GROUP BY 子句中。

  • Using unique index: 表示查询使用了唯一索引进行查找。

  • Using on-disk sort: 表示查询需要在磁盘上进行排序操作,这通常发生在内存中无法容纳所有需要排序的数据时。

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

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

相关文章

每日算法练习(1)

开一个新坑&#xff0c;记录下自己每天的算法练习&#xff0c;希望自己通过1个多月的学习&#xff0c;能够成为算法大神。 下面正式开始新坑。 两个数组的交集 这是牛客上的题&#xff0c;根据题意&#xff0c;我们有多种解法&#xff0c;这题用哈希比较好写。我们可以弄一个…

1.8、数位DP(算法提高课)

一、数字游戏 题目链接&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1588 题意&#xff1a;求给定区间【a&#xff0c;b】中的不降数的个数&#xff0c;不降数的定义为从左到右各位数字成小于等于的关系。 思路&#xff1a;首先预处理出来 f[i][j] 为一共有…

pytorch环境配置踩坑记录

一、问题1 1.执行命令 conda create -n pytorch python3.62.报错如下 Solving environment: failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/msys2/noarch/repodata.json.bz2> Elapsed: -An HTTP error occurred when tr…

Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升&#xff0c;许多编程语言也纷纷效仿&#xff0c;Java 也不例外。 另一边&#xff0c;尽管社区内部问题重重&#xff0c;但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的&#xff1a;Rust 的编译器让开发人员避免了各种问题。编译器对…

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。 文章目录 一、加载地形点云数据二、创建三维地形模型1. 泊松方法2. 贪婪三角形测量方法3. 阿尔法形状注意事项一、加载地形点云数据 加载配套案例数据包中的data074.rar中的地形点云数据…

3D地图大屏 附源码(Three.js + Vue3)

目录 &#x1f44b; 前言 &#x1f680; 项目包 ⚒️ 字体制作 &#x1f310; 地图制作 &#x1f4a1; 参考视频 & 项目 开源项目&#xff08;Vue3tsWindcssEchartThree.js大屏案例&#xff09; 开源&#xff08;教程&#xff09; UI风格学习&#xff08; www.shuzixs.com …

本地事务存在的问题

在微服务中&#xff0c;如果还是使用本地事务会出现问题 比如订单服务中先下订单再调用库存服务再调用用户服务增加积分&#xff0c;这时候如果调用库存服务出现假失败&#xff0c;也就是说实际上成功了&#xff0c;但是因为网络原因没有返回&#xff0c;没返回出错了&#xff…

java调用讯飞星火认知模型

前往讯飞开发平台选择产品&#xff0c;获取appId、apiKey、APISecret&#xff0c;这里我选择的是v3.0模型。 java后端实现 本项目以及实现了基本的会话功能&#xff0c;小伙伴可以自己扩充其他的例如绘画功能。 注意&#xff1a;星火模型的api使用的是websocket协议&#xf…

c 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用&#xff1b; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解&#xff1a; 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

vtk.vtkAssembly()用法解释

vtk.vtkAssembly 是 VTK库中的一个重要类&#xff0c;允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。每个 vtk.vtkAssembly 对象都可以包含其他 vtk.vtkAssembly 对象&#xff0c;构成一个层级的组合结构。 以下是创建并使用 vtk.vtkAssembly 的一个基本示例&…

与上级意见不合时如何恰当地表达自己的观点?

在工作中与上级意见不合时&#xff0c;恰当表达自己的观点并寻求共识是一个需要谨慎处理的问题。以下是一些建议&#xff1a; 1. **尊重与礼貌**&#xff1a;在任何情况下&#xff0c;都应保持对上级的尊重和礼貌。即使在意见不合时&#xff0c;也要避免情绪化&#xff0c;保持…

200页图解国标《数据分类分级规则》正式稿,强化重要数据识别

GB/T 43697-2024《数据安全技术 数据分类分级规则》正式稿发布&#xff0c;并于2024年10月1日实施。2024年4月17日&#xff0c;国家标准全文公开系统公布了国标最终版。《数据分类分级规则》是全国网安标委更名后&#xff0c;发布的第一部以“数据安全技术”命名的国家标准&…

Python-VBA函数之旅-enumerate函数

目录 1、enumerate函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 enumerate函数在Python中是一个强大的内置函数&#xff0c;用于将一个可迭代对象转换为一个索引序列&#xff0c;同时返…

java-spring 图灵 04 doscan

01.本次的重点依旧是扫描函数&#xff0c;这次是spring中的源码&#xff1a; 02.第一步&#xff0c;构造AnnotationConfigApplicationContext 主方法&#xff1a; public static void main(String[] args) {// 创建一个Spring容器AnnotationConfigApplicationContext applica…

基于react native的android原生微信客服,微信支付以及判断是否安装微信

基于react native的android原生微信客服&#xff0c;微信支付以及判断是否安装微信 引入SDK&#xff08;Android Studio 环境下&#xff09;创建wxapi/WXPayEntryActivity.java&#xff08;用于接收微信响应返回信息&#xff09;CustomerServiceModule.javaCustomerServicePack…

C#基础|Debug程序调试学习和技巧总结

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在程序的开发过程中&#xff0c;可能绝大部分时间是用来调试程序&#xff0c; 当完成了某个功能的编程&#xff0c;都需要调试一下程序&#xff0c;看编程是否存在问题。 01 为什么需要程序调试 无论是电气工程师还…

深入探究图像增强(C语言实现)

我们将从基础出发使用C语言进行图像处理与分析&#xff0c;重点讨论图像增强和平滑技术。图像增强技术旨在通过增加对比度、亮度和整体清晰度来改善图像的视觉质量。另一方面&#xff0c;图像平滑方法则用于减少噪声并减少图像中的突变&#xff0c;使图像更加均匀和视觉上吸引人…

2024新版淘宝客PHP网站源码

源码介绍 2024超好看的淘客PHP网站源码&#xff0c;可以做优惠券网站&#xff0c;上传服务器&#xff0c;访问首页进行安装 安装好了之后就可以使用了&#xff0c;将里面的信息配置成自己的就行 喜欢的朋友们拿去使用把 效果截图 源码下载 2024新版淘宝客网站源码

【QT进阶】Qt Web混合编程之实现ECharts数据交互动态修改

往期回顾&#xff1a; 【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之html、 js的简单交互-CSDN博客【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等-CSDN博客 【QT进阶】Q…

高精度算法(1)

前言 今天来讲一讲高精度算法&#xff0c;我们说一个数据类型&#xff0c;有它的对应范围比如int类型最多 可以包含到负2的31次方到2的31次方减一 其实大概就是20亿左右那么其他的类型也同样如此 那么&#xff0c;如何解决一个很大很大的数的运算呢&#xff1f; 我们今天介…