explain各字段的含义

news2024/12/28 5:00:32

MySQL 5.6.3以前只能EXPLAIN SELECT; 5.6.3以后就可以EXPLAIN SELECT,UPDATE,DELETE


有这样一张user表,300多万行记录,表结构及索引信息如下:


alt

对于sql:


SELECT
 * 
FROM
 `user` 
WHERE
 id > 20000 
 AND country > 1 
 AND grade IN ( 14 ) 
 AND city IN ( 1500100015003000 ) 
ORDER BY
 update_time DESC 
 LIMIT 30;

explain结果如下:

alt



alt



1.id


SQL查询中的序列号

id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行。



2.select_type


查询的类型, 可以是如下的任何一种类型:

alt


3.table


查询的表名. 并不一定是实际存在的表名.

可以为如下的值:

  • <unionM,N>: 引用id为M和N UNION后的结果。

  • <derivedN>: 引用id为N的结果派生出的表。派生表可以是一个结果集,例如派生自FROM中子查询的结果。

  • <subqueryN>: 引用id为N的子查询结果物化得到的表。即生成一个临时表保存子查询的结果。



4.partitions


5.7以前,该项是explain partitions显示的选项; 5.7以后成为了默认选项.

该列显示的为分区表命中的分区情况, 非分区表该字段为空(NULL).



5.type


最重要的一个指标, 显示查询使用了何种类型

ALL之外, 其他type都可以用到索引; 除index_merge外, 其他type只可用到一个索引.


由左到右,性能由差到好:

ALL,index,range,index_subquery,unique_subquery,index_merge,ref_or_null,fulltext,ref,eq_ref,const,system

从上到下,性能由差到好:


(1) ALL


扫描全表,性能最差.

>>>>>>


(2) index


扫描全部索引树

或称"索引全表扫描", 即把索引从头到尾扫一遍.

包含两种情况:

  1. 查询使用了覆盖索引, 那么只需要扫描索引就可以获得数据. 这个效率要比全表扫描快, 因为索引通常比数据表小, 且还能避免二次查询. 这种情况在extra中显示Using index.

  2. 反之, 如果在索引上进行全表扫描,则extra字段没有Using index.


如对于user表,telephone字段建有索引,如果

<1>.

explain select telephone from user;,则type字段将为index


<2>.

explain select amount_coin from user;,

因为amount_coin字段没有建索引, 故而type字段将为ALL


<3>.

explain select * from user;,

如果包含没有建索引的列, type字段也将为ALL

>>>>>>


(3) range


扫描部分索引

索引范围扫描, 对索引的扫描开始于某一点, 返回匹配值域的行,常见于 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等运算符的查询中

>>>>>>


(4) index_subquery


该联接类型类似于下面的unique_subquery

适用于非唯一索引, 可以返回重复值.

>>>>>>


(5) unique_subquery


用于wherein形式的子查询.

子查询返回不重复值唯一值, 可以完全替换子查询, 效率更高.

该类型替换了下面形式的IN子查询的ref:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

>>>>>>


(6) index_merge


表示查询使用了两个以上的索引, 最后取交集或者并集, 常见and ,or的条件使用了不同的索引.

官方排序这个在下面的ref_or_null之后, 但实际上由于要读取多个索引,性能可能大部分时间都不如更下面的range

>>>>>>


(7) ref_or_null


跟下面的ref类型类似, 只是增加了null值的比较.

实际用的不多

>>>>>>


(8) fulltext


使用全文索引type会是这个类型.

注意,全文索引的优先级很高,若全文索引普通索引同时存在时, mysql不管代价, 会优先选择使用全文索引

>>>>>>


(9) ref


使用非唯一索引或非唯一索引前缀进行的查找

对于来自前表的每一行,在当前表的索引中可以匹配到多行.

若连接只用到索引的最左前缀索引不是主键或唯一索引时, 使用ref类型(可以理解成可能出现"一对多"时)

ref可用于使用'='或'<=>'操作符作比较的索引列

>>>>>>


(10) eq_ref


唯一性索引扫描, 对于每个索引键, 表中只有一条记录与之匹配.


eq_refconst的区别:

eq_ref 出现于多表join时, 对于来自前表的每一行, 在当前表中只能找到一行.

这是除了下面几种类型之外最好的类型. 当主键或唯一非NULL索引的所有字段都被用作join联接时会使用此类型.

eq_ref 可用于使用'='操作符作比较的索引列, 比较的值可以是常量, 也可以是使用在此表之前读取的表的列的表达式.

>>>>>>


(11) const


const: 单表中最多有一个匹配行, 例如根据主键或唯一索引查询. (如 select * from user where id=100), 查询起来非常迅速

>>>>>>


(12) system


systemconst类型的特例,只会出现在MyisamMemory存储引擎, 当查询的表只有一行或空表的情况下,type字段将是system.

如果是Innodb引擎表, type列在这种情况通常都是ALL或者index.

这种类型可以可以忽略不计

>>>>>>


(13) NULL


不用访问表或者索引,直接就能得到结果, 如 explain select NOW()

alt



6.prossible_keys


可能使用到的索引



7.key


真正使用到的索引

select_typeindex_merge时, 这里可能出现两个以上的索引;

其他的select_type这里只会出现一个.



8.key_len


查询用到的索引长度(字节数)

如果是单列索引, 那就整个索引长度算进去;

如果是多列索引(即联合索引),那么查询不一定都能使用到所有的列,用多少算多少.


可以留意下这个列的值, 算一下多列索引总长度, 就可知有没有使用到所有的列.

另: key_len只计算where条件用到的索引长度, 而排序和分组就算用到了索引,也不会计算到key_len中.



9.ref


如果使用常数等值查询, 这里会显示const;

如果是连接查询, 被驱动表的执行计划这里会显示驱动表的关联字段,

如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换, 这里可能显示为func



10.rows


非常重要的一个字段


mysql估算的 需要扫描的行数(不是精确值)

通过这个值,可以非常直观地显示 SQL 的效率好坏.

原则上 rows 越小越好.

当存在limit时,会对rows字段产生影响. 建议在explain时先去除limit



11.filtered


这个字段表示存储引擎返回的数据在server层过滤后, 剩下多少满足查询的记录数量的比例;

注意是百分比,不是具体记录数.



12.Extra


非常重要的一个字段


explain 中的很多额外信息会在 Extra 字段显示, 常见的有以下几种内容:

  • distinct:在select部分使用了distinc关键字

  • Using filesort 当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作(优先内存,内存空间不够则会在磁盘排序), 不能通过索引顺序达到排序效果. 一般存在 Using filesort, 都建议通过优化去掉, 因为这样的查询对机器的资源消耗很大.

  • Using index: "覆盖索引扫描", 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错. 即不需要进行filesort

  • Using temporary: 查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议通过优化去掉.

另外还有

  • using where:在查找使用索引的情况下,需要回表去查询所需的数据

  • using index condition:查找使用了索引,但是需要回表查询数据

  • using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

using index 好于 using where 好于 using index condition, 不需要回表查询数据,效率最快


在带有order by子句的sql中,要尽可能使extra字段不要出现Using filesort,而是Using index


举例如何去掉 Using filesort:

explain结果每个字段的含义说明[1]

mysql 索引type介绍[2]

MySQL优化:定位慢查询的两种方法以及使用explain分析SQL[3]




limit 会对explain的type产生巨大影响

关于order by的优化

具有LIMIT和不具有LIMIT的ORDER BY可能是不同的

file_sort优化器会预先分配固定数量的sort_buffer_size字节。

MySQL 有时会优化具有LIMIT row_count子句而没有HAVING子句的查询:

如果您只选择LIMIT的几行,则在某些情况下,MySQL 通常会选择使用全 table 扫描,而 MySQL 通常会使用索引。

如果将LIMIT row_count和ORDER BY结合使用,MySQL 会在找到排序结果的前* row_count 行后立即停止排序,而不是对整个结果进行排序。如果通过使用索引进行排序,这将非常快。如果必须执行文件排序,则在找到第一个 row_count *之前,将选择与查询匹配的所有行,但不带有LIMIT子句,并对其中的大多数或全部进行排序。找到初始行后,MySQL 不会对结果集的其余部分进行排序。

如果没有为ORDER BY使用索引,但是也存在LIMIT子句,则优化器可能能够避免使用合并文件,并使用内存中filesort操作对内存中的行进行排序。

参考:

优化 Sequences[4]

Orderby 排序优化[5]

理解mysql的临时表和文件排序[6]

【IT老齐338】MySQL Extra常见信息解析[7]

【大厂文章速读】字节跳动-慢SQL分析与优化[8] (extra出现这几项,一定要加倍注意)

参考资料

[1]

explain结果每个字段的含义说明: https://www.jianshu.com/p/8fab76bbf448

[2]

mysql 索引type介绍: https://blog.csdn.net/L_ieluil/article/details/62885392

[3]

MySQL优化:定位慢查询的两种方法以及使用explain分析SQL: https://baijiahao.baidu.com/s?id=1644795692359019265&wfr=spider&for=pc

[4]

优化 Sequences: https://www.docs4dev.com/docs/zh/mysql/5.7/reference/order-by-optimization.html

[5]

Orderby 排序优化: https://learnku.com/articles/38925

[6]

理解mysql的临时表和文件排序: https://plu.one/mysql/2019/02/24/mysql-understand-temporary-and-filesort/

[7]

【IT老齐338】MySQL Extra常见信息解析: https://www.bilibili.com/video/BV1Ch41157e

[8]

【大厂文章速读】字节跳动-慢SQL分析与优化: https://www.bilibili.com/video/BV1vg411p7uJ

本文由 mdnice 多平台发布

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

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

相关文章

【LeetCode: 1462. 课程表 IV:拓扑排序+图+广度优先搜索】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

开源社区赋能,Walrus 用户体验再升级

基于平台工程理念的应用管理平台 Walrus 已于上月正式开源&#xff0c;目前在 GitHub 已收获 177 颗星&#x1f31f; Walrus 希望打造简洁清爽的应用部署与管理体验&#xff0c;帮助研发与运维团队减少“内耗”工作&#xff0c;提升开发体验。 我们十分重视 Walrus 用户的…

SpringBoot AOP实现日志或告警(高级)

文章目录 总结&#xff1a;技术点 动态代理 模版方法模式 线程池异步处理/MQ一、目的二、难点&#xff1a;如何实现不同接口不同入参的数据转换?三、代码实现1.定义 切点注解接口2.定义 转换接口和模版方法3.定义 切面类4.定义 转换实现类5.业务方法使用注解6.常量类和枚举 …

pytorch中的seq2seq的人们国籍分类的示例

一、查漏补缺、用法分析&#xff1a; 1.这个简单的RNN网络示意图是我看过的最清晰明了的&#xff1a; 2.震惊&#xff01;原来之前关于seq2seq不明白的地方这里都进行了对应的讲解 02 用字符级别的循环神经网络来判断一个人的名字是哪个国家的常用名 - 知乎 (zhihu.com) 请认…

通过bigMap工具获取地图上各地方的经纬度范围

首先去官网下载bigMap工具,地址&#xff1a;http://www.bigemap.com/reader/download/ 下载成功点击软件&#xff0c;我们会出现这个页面&#xff0c;然后接下来就是选择区域了 相对应上面的操作之后&#xff0c;我们点击箭头&#xff0c;把我们的这个区域下载下来&#xff0c;…

win 10 安装新程序总是弹出提示:目前无法访问smartscreen

win 10 安装新程序总是弹出提示&#xff1a;目前无法访问smartscreen 因为后来无法再现警告&#xff0c;无法截图 搜索安全&#xff0c;找到 Windows 安全中心 找到“应用和浏览器控制”&#xff0c;关闭其中 2 项 SmartScreen 奇怪的是&#xff0c;之后我又改回去了&#x…

自助式数据分析平台:JVS智能BI功能介绍(二)数据集管理

数据集是JVS-智能BI中承载数据、使用数据、管理数据的基础&#xff0c;同样也是构建数据分析的基础。可以通俗地将其理解为数据库中的普通的表&#xff0c;他来源于智能的ETL数据加工工具&#xff0c;可以将数据集进行分析图表、统计报表、数字大屏、数据服务等制作。 在整体的…

Codeforces Round 897 (Div. 2) D. Cyclic Operations

置换环。 i向a[i]连边&#xff0c;最终一定会连出一个环&#xff0c;有可能存在着一条链在后边跟这&#xff0c;这个环的长度一定要等于k才是满足题意的。 出现链的原因就是链在成环的路上被另一条成环的路覆盖了。 对于任何k > 2的情况&#xff0c;链是可以任意长的&…

开学ipad手写笔有必要买原装吗?推荐平价好用的电容笔

学生们都在为即将到来的新学期做准备&#xff0c;而iPad又是必不可少的一部分。科技的飞速发展改变了人们的生活。现在&#xff0c;各种各样的电子和数字产品都有了&#xff0c;所以才有了这种可以和平板电脑搭配使用的电容笔。随着国内电容笔的芯片技术的不断进步&#xff0c;…

Ubuntu22.04开启后屏幕黄屏

1. 故障现象 系统&#xff1a;Ubuntu22.04 现象&#xff1a;电脑从开机到进入桌面一直屏幕黄屏 2. 故障分析 可能为屏幕色彩调节出现故障 3. 解决方案 系统设置——》色彩——》删除原来的配置&#xff08;remove profile&#xff09;——》添加配置Colorspace:Compatibl…

Ubuntu 22.04LTS + 深度学习环境安装全流程

一、 CUDA Toolkit 安装 1. 选择需要安装的版本(下载地址) 2. 选择自己的系统版本获取下载地址和安装指令 3. 运行安装指令进行安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo sh cuda_12.2.…

_locked勒索病毒有什么特点,中了_locked勒索病毒该如何解决?

_locked是一种新型的勒索病毒&#xff0c;它通常通过电子邮件附件、恶意网站、云存储等途径传播。这种病毒一旦感染系统&#xff0c;就会加密受感染设备中的文件&#xff0c;并要求受害者支付一定数额的赎金以解密文件。这种病毒的特点、解决方案和预防措施如下&#xff1a; 特…

皕杰报表(BIOS Report)中设置序号的方法之四

我们分享了皕杰报表设置序号的三种方法&#xff0c;ds.#0&#xff0c;&cellx和row()&#xff0c;有时用这些方法设置序号并不能满足我们的需求&#xff0c;需要配以显示值的使用&#xff0c;使得序号分类更加清楚。我们看下面的主从表&#xff0c;是如何处理序号的显示值的…

第二证券:股利支付率和留存收益率的关系?

股利付出率和留存收益率是股票出资中非常重要的目标&#xff0c;它们可以反映公司的盈余才能和未来开展的潜力。那么&#xff0c;二者之间究竟有什么联系呢&#xff1f; 一、股利付出率和留存收益率的定义 股利付出率是指公司向股东分配的股息占当期净利润的比例&#xff0c;通…

【OAuth漏洞】第三方身份验证-账号接管

目录 什么是OAuth&#xff1f; OAuth 如何用于身份验证&#xff1f; 在 Booking.com 实施 OAuth 为什么 Booking.com OAuth 在 Booking.com 中的工作原理 Booking.com 帐户接管 安全漏洞 1 - 不允许唯一路径 安全漏洞 2 - 开放重定向 安全漏洞 1 2 帐户接管尝试 更…

navicat SSH连接数据库报错: Putty key format too new

问题 下载 Putty 0.79 生成了密钥&#xff0c;但是在navicat 15 使用SSH通道连接数据库报错: Putty key format too new 错误原因和处理 原来是因为生成的私钥格式是 V3 &#xff0c; navicat 15 只能识别 V2 所以&#xff0c;在 PuTTYgen Load 私钥&#xff0c;重新保存为 …

Windows MongoDB详细安装与配置

MongoDB详细安装与配置 下载地址 MongoDB安装 1.双击安装包进行安装 2.点击I accept the tems in the license agreement&#xff0c;点击Next 3.选择默认安装路径&#xff0c;点击completem&#xff1b;自定义安装路径&#xff0c;点击custom,点击browse选择路径&#xff0c…

听说,你想做大模型时代的应用层创业!

亲爱的科技探险家们和代码魔法师们&#xff1a; 未来的钟声已经敲响&#xff0c;预示着一场极度炫酷的虚拟现实游戏即将展开。从初期简单的智能识别&#xff0c;到设计师级别的图纸设计&#xff0c;生成式AI技术&#xff08;Generative AI&#xff09;以其独特理念和创新模式重…

【校招VIP】前端计算机网络之UDP相关

考点介绍 UDP是一个简单的面向消息的传输层协议&#xff0c;尽管UDP提供标头和有效负载的完整性验证&#xff08;通过校验和&#xff09;&#xff0c;但它不保证向上层协议提供消息传递&#xff0c;并且UDP层在发送后不会保留UDP 消息的状态。因此&#xff0c;UDP有时被称为不可…

2023 9月最新彩虹易支付系统源码

2023 9月最新彩虹易支付系统源码 更新日志&#xff1a; 1.新增微信公众号消息提醒功能 2.重构转账付款功能&#xff0c;支持通过插件扩展 3.商户后台新增代付功能 4.后台新增付款记录列表 5.支付宝插件新增预授权支付 6.优化支付通道列表&#xff0c;支持翻页与快速复制…