前言

只有光头才能变强

刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了)..

之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。今天发现自己的TODO LIST有这么两个命令,于是打算来学习一番,记录一下~

使用的MySQL的版本为5.6.38

一、explain命令

1.1体验explain命令

首先我们来体验一下explain命令是怎么使用的,以及输出的结果是什么:

explain select * from table_user ;

输出结果:

发现很使用起来很简单,只要explain后边跟着SQL语句就完事了(MySQL5.6之前的版本,只允许解释SELECT语句,从 MySQL5.6开始,非SELECT语句也可以被解释了)。

1.2为什么需要explain命令

我们很多时候编写完一条SQL语句,往往想知道这条SQL语句执行是否高效。或者说,我们建立好的索引在这条SQL语句中是否使用到了,就可以使用explain命令来分析一下!

简单来说:通过explain命令我们可以学习到该条SQL是如何执行的,随后解析explain的结果可以帮助我们使用更好的索引,最终来优化它!

通过explain命令我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。

// 好了,我们下面看一下explain出来的结果是怎么看的。

1.3读懂explain命令结果

explain命令输出的结果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

1.3.1id

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

在id列上也会有几种情况:

如果id相同执行顺序由上至下。

如果id不相同,id的序号会递增,id值越大优先级越高,越先被执行。

(一般有子查询的SQL语句id就会不同)

1.3.2select_type

表示select查询的类型

select_type属性下有好几种类型:

SIMPLLE:简单查询,该查询不包含 UNION 或子查询

PRIMARY:如果查询包含UNION 或子查询,则最外层的查询被标识为PRIMARY

UNION:表示此查询是 UNION 中的第二个或者随后的查询

DEPENDENT:UNION 满足 UNION 中的第二个或者随后的查询,其次取决于外面的查询

UNION RESULT:UNION 的结果

SUBQUERY:子查询中的第一个select语句(该子查询不在from子句中)

DEPENDENT SUBQUERY:子查询中的 第一个 select,同时取决于外面的查询

DERIVED:包含在from子句中子查询(也称为派生表)

UNCACHEABLE SUBQUERY:满足是子查询中的第一个 select 语句,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中

UNCACHEABLE UNION:满足此查询是 UNION 中的第二个或者随后的查询,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中

类型有点多啊,我加粗的是最常见的,起码要看得懂加粗的部分。

1.3.3table

该列显示了对应行正在访问哪个表(有别名就显示别名)。

当from子句中有子查询时,table列是 格式,表示当前查询依赖 id=N的查询,于是先执行 id=N 的查询

1.3.4type

该列称为关联类型或者访问类型,它指明了MySQL决定如何查找表中符合条件的行,同时是我们判断查询是否高效的重要依据。

以下为常见的取值

ALL:全表扫描,这个类型是性能最差的查询之一。通常来说,我们的查询不应该出现 ALL 类型,因为这样的查询,在数据量最大的情况下,对数据库的性能是巨大的灾难。

index:全索引扫描,和 ALL 类型类似,只不过 ALL 类型是全表扫描,而 index 类型是扫描全部的索引,主要优点是避免了排序,但是开销仍然非常大。如果在 Extra 列看到 Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要少很多。

range:范围扫描,就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。这个类型通常出现在 =、<>、>、>=、、BETWEEN、IN() 的操作中,key 列显示使用了哪个索引,当 type 为该值时,则输出的 ref 列为 NULL,并且 key_len 列是此次查询中使用到的索引最长的那个。

ref:一种索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引的查询。

eq_ref:使用这种索引查找,最多只返回一条符合条件的记录。在使用唯一性索引或主键查找时会出现该值,非常高效。

const、system:该表至多有一个匹配行,在查询开始时读取,或者该表是系统表,只有一行匹配。其中 const 用于在和 primary key 或 unique 索引中有固定值比较的情形。

NULL:在执行阶段不需要访问表。

1.3.5possible_keys

这一列显示查询可能使用哪些索引来查找

1.3.6key

这一列显示MySQL实际决定使用的索引。如果没有选择索引,键是NULL。

1.3.7key_len

这一列显示了在索引里使用的字节数,当key列的值为 NULL 时,则该列也是 NULL

1.3.8ref

这一列显示了哪些字段或者常量被用来和key配合从表中查询记录出来。

1.3.9rows

这一列显示了估计要找到所需的行而要读取的行数,这个值是个估计值,原则上值越小越好。

1.3.10extra

其他的信息

常见的取值如下:

Using index:使用覆盖索引,表示查询索引就可查到所需数据,不用扫描表数据文件,往往说明性能不错。

Using Where:在存储引擎检索行后再进行过滤,使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。

Using temporary:在查询结果排序时会使用一个临时表,一般出现于排序、分组和多表 join 的情况,查询效率不高,建议优化。

Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。

最后

原本以为Explain命令是比较难学的,但查找资料看下来,之前只是不知道具体的列和列中下的属性是什么意思而已。常见出现的其实也就那么几个,感觉对着每个属性多看一会,还是可以能看懂的。

当然了,在《高性能MySQL》中也有复杂的SQL语句来分析(但我认为我们一般不会写到那么复杂)..

这篇文章也借鉴了很多其他优秀的博客,如果大家有兴趣的话可以去阅读一下:

如果你觉得我写得还不错,了解一下:

explain mysql执行顺序_面试前必须知道的MySQL命令【explain】相关推荐

  1. Java架构-面试前必须知道的MySQL命令【explain】

    刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记.今天发现自己的TODO LIST ...

  2. 必须知道的linux命令,29 个你必须知道的 Linux 命令

    虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的.Bash和 Linux Shell ...

  3. jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了

    https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止 ...

  4. 判断苹果黑条_买iPhoneXS前必须知道的20件事

    苹果iPhoneXSMax评测:对于这次2018苹果新品发布会,很多网友反映:收看乔帮主时代的苹果发布会,先对产品发表一句:我的天呐,牛X! 然后再对价格发出感叹:唉~ 事到如今,库克引领的苹果发布会 ...

  5. python怎么学比较有技巧_学python必须知道的30个技巧

    收集这些有用的捷径技巧 1. 原地进行交换两个数字 我们对赋值的右侧进行一个新的元组,左侧解析(unpack)那个(未被引用的)元组到变量 和 赋值完成时,新的元组变成了未被引用状态并且被标记没用处, ...

  6. 小程序全局悬浮窗_手机控必须知道的“小白点”技巧,错过真是浪费

    大家对于小白点的印象大都来源于苹果手机里的「Assistive Touch」即辅助触控功能.也是我们常说的悬浮窗,一般是灰白色,所以也被称为"小白点". 在全面屏之前的触屏时代,小 ...

  7. css设置按钮竖直方向居中_前端设计师必须知道的10个重要的CSS技巧

    对于一个初入门的前端设计师,在设计修改网站前端的时候,我们需要编写一些CSS.JS的内容达到界面效果.今天分享10个对于前端设计师来说重要的CSS技巧,这也是我在给许多客户做网站的过程当中总结出来的. ...

  8. linux命令修改管理员时间,Linux管理员必须知道的sudo命令

    "Sudo"是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的"权利",让他们执行一些只有超级用户或其他 特许用户才能完 ...

  9. 程序员掌握linux命令,程序员必须知道的linux命令

    ---    查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找 ...

  10. 29个你必须知道的Linux命令

    如果你是一个新手,并尝试使用命令行接口,本文收集了各种基本的Linux命令来供你学习,帮你在各种Linux发行版中完成各种任务.虽然不是很详细,但是对Linux初学者,或普通用户,或管理员都是很有用的 ...

最新文章

  1. 包含近 20 万本图书,OpenAI 级别的训练数据集上线
  2. php this 代表什么,php中$this-是什么意义
  3. spring boot创建应用 端口冲突8080
  4. @jsonfield注解_好了,不装了,撸个注解有什么难的!
  5. 数据仓库--基本概念
  6. python异常处理的语法格式_Python异常处理
  7. 15什么时候你最想打人
  8. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(8)——Comparison
  9. 自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)
  10. 判断坐标在矩阵的哪个(资源带)圈范围
  11. 【代码优化】考虑使用静态工厂方法代替构造器
  12. 如何mysql学籍管理系统_MySQL基础-学生管理系统数据库设计
  13. 决定要收藏,让你白嫖阿里矢量图(iconfont矢量图使用)
  14. windows清理c盘的三种有效方法
  15. 单页网站不会限制您的选择
  16. 非机动车检测,电动车自行车检测
  17. 云原生容器化-1 Linux虚拟网络介绍
  18. h5py OSError: Unable to open file (unable to lock file, errno = 11, error message = ‘Resource tempor
  19. viso直线相交不跳线不弯曲
  20. 快来看!一键式、企业级的大数据综合分析平台上线啦

热门文章

  1. vscode extensions
  2. mfc背景图片覆盖控件问题
  3. Centos开机自动执行shell脚本启动tomcat服务器
  4. 虚函数中调用父类同名虚函数
  5. Unity2018引用System.Windows.Forms.dll发布报错
  6. Unity2017探究Layout布局
  7. linux安装python3环境_linux安装python3环境并配置虚拟环境
  8. HTTP与HTTPS之间的联系与连接状态
  9. java的addattribute_Java AttributeSet.addAttributeListener方法代码示例
  10. 求解出能被5整除的正整数的乘积_事业单位数量关系:巧用“整除”求解数量关系...