php mysql explain_MySQL Explain详解

MySQL Explain详解

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。

— 实际SQL,查找用户名为Jefabc的员工

select * from emp where name = 'Jefabc';

— 查看SQL是否使用索引,前面加上explain即可

explain select * from emp where name = 'Jefabc';

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

概要描述:

id:选择标识符

select_type:表示查询的类型。

table:输出结果集的表

partitions:匹配的分区

type:表示表的连接类型

possible_keys:表示查询时,可能使用的索引

key:表示实际使用的索引

key_len:索引字段的长度

ref:列与索引的比较

rows:扫描出的行数(估算的行数)

filtered:按表条件过滤的行百分比

Extra:执行情况的描述和说明

下面对这些字段出现的可能进行解释:

一、 id

SELECT识别符。这是SELECT的查询序列号

我的理解是SQL执行的顺序的标识,SQL从大到小的执行

id相同时,执行顺序由上至下

如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

— 查看在研发部并且名字以Jef开头的员工,经典查询

explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like 'Jef%' and d.name = '研发部';

二、select_type

示查询中每个select子句的类型

(1) SIMPLE(简单SELECT,不使用UNION或子查询等)

(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

(3) UNION(UNION中的第二个或后面的SELECT语句)

(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)

(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)

(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)

(8) DERIVED(派生表的SELECT, FROM子句的子查询)

(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

三、table

显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称

四、type

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。

常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

range:只检索给定范围的行,使用一个索引来选择行

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

五、possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

六、Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

七、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

不损失精确性的情况下,长度越短越好

八、ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

九、rows

估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

十、Extra

该列包含MySQL解决查询的详细信息,有以下几种情况:

Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by

Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”

— 测试Extra的filesort

explain select * from emp order by name;

Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。

Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

No tables used:Query语句中使用from dual 或不含任何from子句

-- explain select now() from dual;

总结:

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

• EXPLAIN不考虑各种Cache

• EXPLAIN不能显示MySQL在执行查询时所作的优化工作

• 部分统计信息是估算的,并非精确值

• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

通过收集统计信息不可能存在结果

作者:杰克思勒

出处:http://www.cnblogs.com/tufujie/

如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!

版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。

感悟代码魅力,享受美好人生!

分类: MySQL, 数据库技术

标签: MySQL Explain详解

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

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

相关文章

指针易出错点一

2019独角兽企业重金招聘Python工程师标准>>> 声明指针中会遇到的问题 int* p1,p2; 上面这条语句的本意应该是声明两个指向int的指针,而实际的效果是p1是指针类型,p2却是int类型,这是因为在C语言中,声明和解释的语法并…

206块积木,72套进阶玩法!玩转STEAM教育,帮你省掉上万块的乐高课

▲数据汪特别推荐点击上图进入玩酷屋作为一名资深积木达人,小木我可是大大小小的积木阅览无数,当然乐高也不会放过,虽然“钱包君”已经是路人了。(每月的工资用来买乐高~)之前给大家推荐了一款STEM积木,小小…

python如何正则匹配浮点值_python使用正则搜索字符串或文件中的浮点数代码实例...

# -*- coding: utf-8 -*-#----------------------------------------------------------------------# FileName:gettxtdata.py#功能:读取字符串和文件中的数值数据(浮点数)#主要提供类似matlab中的dlmread和dlmwrite函数#同时提供loadtxtdata和savetxtdata函数#Data: 2013-1-1…

用了VS2022,你可能再也回不去旧版!

VS2022发布第11天,最直接的使用感受就是智能提示太哇塞了,之前是提示一个单词,现在直接提示一行,撸码速度直接起飞!再就是打开ASP.NET Core的源码,500多个项目3G的体积,过程比VS2019要顺滑多了&…

poj2578

简单题 #include <cstdio>int main() {int f[5];for (int i 0; i < 3; i){scanf("%d", &f[i]);if (f[i] < 168){printf("CRASH %d\n", f[i]);return 0;}}printf("NO CRASH\n");return 0; } View Code 转载于:https://www.cnblo…

意大利归还中国文物;翟天临咪蒙成考公务员题目;携程回应五一机票涨价;腾讯未成年人网络保护体系上线;这就是今天的大新闻...

今天是3月25日农历二月十九今天星期一整个周末都贡献给都挺好了下面是今天的大新闻意大利归还796件中国文物&#xff08;新京报&#xff09;3月23日&#xff0c;在中国主席和意大利总理孔特共同见证下&#xff0c;中意双方代表交换关于796件套中国流失文物艺术品返还的证书。这…

为什么mysql与eclipse_mysql的用户名和密码都是正确的,但是eclipse启动说不对

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼[ WARN] 2014-06-24 17:11:20(BasicResourcePool.java:run:1841)com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask1418841 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a ne…

Hello Blazor:(1)像ASP.NET WebForm一样写代码

写在前面最近&#xff0c;刚开始学习Blazor。对于后端出身的程序员来说&#xff0c;使用Blazor上手开发前端程序&#xff0c;门槛确实降低了不少。还在观望的朋友可以尝试入坑了。在学习和编写Blazor程序的过程中&#xff0c;我产生了一些想法&#xff0c;将会逐渐在本系列中呈…

VScode设置背景颜色

1.打开VSCode,点击左上角文件选项 2.点击首选项 3.点击颜色主题 4.使用键盘上下方向键即可选择不同颜色的背景

选择比努力更重要,这些微信号值得你细细品读。

一个人无论是平凡的还是不平凡的只是自自然然地按照自己喜欢的样子去生活这是最省力且最快乐的人生选择以下几个优质公众号能让你在闲暇的时候不断的提升自我&#xff0c;拓宽视野愿以书卷气&#xff0c;行我路千里长按二维码&#xff0c;选择【识别图中二维码】关注少年数学家…

ci mysql高并发_高并发访问mysql时的问题(一):库存超减

标签&#xff1a;如果在对某行记录的更新时不采取任何防范措施,在多线程访问时,就容易出现库存为负数的错误.以下用php、mysql,apache ab工具举例说明:mysql表结构CREATE TABLEyxt_test_concurrence (idint(11) NOT NULLAUTO_INCREMENT,valueint(11) NOT NULL COMMENT ‘库存‘…

ASP.NET Core 6 Minimal API

ASP.NET Core 6 Minimal APIIntro微软在 ASP.NET 6 Preview 4 的介绍文章中介绍了即将到来的 ASP.NET Core 6 中的最小 API 的雏形&#xff0c;我们现在已经基本可以达到最小化 API 了雏形了&#xff0c;在 Preview 4 的时候就写了这个小示例&#xff0c;但是不够简洁&#xff…

Form身份验证

网站安全模式 使用Windows身份验证 使用Forms身份验证 使用最多,也是最常见的方式 使用PassPort身份验证(收费) 需要MS给接口 Forms身份验证 Web.config <system.web> <authentication mode"Forms"> <forms loginUrl"登陆地址.aspx&…

支付宝今日起还卡收费;大城市女性买房猛增;小米发布100W快充技术;严查非法办学行为;交大通报博导辱骂学生;这就是今天的大新闻...

今天是3月26日农历二月二十今天星期二不是个让人可以昏昏欲睡的日子下面是今天的大新闻支付宝还信用卡开始收费&#xff08;澎湃新闻&#xff09;根据支付宝此前发布的消息&#xff0c;自3月26日起&#xff0c;通过支付宝给信用卡还款超过免费额度后将收取0.1%的服务费&#xf…

mysql connector c编程_MySQL数据库之MySQL Connector 编程

本文主要向大家介绍了MySQL数据库之MySQL Connector 编程 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。MySQL Connector 是MySQL数据库客户端编程的接口, 它提供了通过网络访问数据库的接口, 这些功能在动态链接库(.dll, .so)或者静态…

WPF任务栏同步进度

一、概要本篇文章主要分享使用TaskbarItemInfo对象&#xff08;WPF&#xff09;在window操作系统的任务栏中同步任务进度的功能。什么是TaskbarItemInfo对象&#xff1f;TaskbarItemInfo类为 Windows 7 任务栏功能提供托管包装。有关 Windows shell 和本机任务栏 Api 的详细信息…

每日一笑 | 各大互联网公司离职员工群名

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图源网络&#xff0c;侵权删&#xff09;

优秀的培训机构该如何培养学生?

作为一个优秀的培训机构来讲&#xff0c;培训的关键是提升学生的学习思想、养成良好学习习惯&#xff0c;培养学生较强的自学能力&#xff0c;否则讲再多的知识都还是少&#xff01; 老男孩培训多年来正是在履行着这样的教学理念和思路。 动物园的动物&#xff0c;如果不…

mysql快照过久_Oracle 快照(snapshot) 管理

----手工创建Oracle 快照 BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); END; / ---删除快照 具体快照信息可以查看视图 D----手工创建Oracle 快照BEGINDBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();END;/---删除快照具体快照信息可以查看视图 DBA_HIST_SNAPSHOTBEGIND…

WPF 左侧菜单样式

之前做了一个菜单样式&#xff0c;这样的&#xff1a;链接&#xff1a;WPF 修改(优化)Menu菜单的样式如今又来一个左侧菜单样式&#xff0c;其实只是修改了一下模板&#xff0c;如下图&#xff1a;还是老样子&#xff0c;代码全部都在MainWindow.xaml中&#xff1a;<Window …