前言

只有光头才能变强

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

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

使用的MySQL的版本为5.6.38

MySQL版本

一、explain命令

1.1体验explain命令

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

explain select * from table_user ;

输出结果:

体验explain命令

发现很使用起来很简单,只要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就会不同)

explain一下拥有子查询的SQL

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

explain ref_面试前一定要知道的MySQL命令【explain】相关推荐

  1. 面试前必须要知道的Redis面试题

    前言 回顾前面: 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redis[黄金] 从零单排学Redis[铂金一] 从零单排学Redis[铂金二] Redis 今天来分享一下R ...

  2. ktt算法 约化_答:那些深度学习《面试》你可能需要知道的

    本文是问题"那些深度学习<面试>你可能需要知道的"的回答,答案均以英文版Deep Learning页标标记. 1.列举常见的一些范数及其应用场景,如L0,L1,L2,L ...

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

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

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

    29 个你必须知道的 Linux 命令 2016-08-12    分类:操作系统.编程开发.首页精华暂无人评论     来源:dwqs 分享到:更多0 虽然Linux发行版支持各种各样的饿GUI(g ...

  5. linux 终端 画圆,16个圆桌面Linux用户必须要知道的Shell命令

    16个圆桌面Linux用户必须要知道的Shell命令 16个圆桌面Linux用户必须要知道的Shell命令 日期:2014-05-16 浏览次数:20305 次 16个桌面Linux用户必须要知道的S ...

  6. 你应该知道的linux命令 — lsof

    在linux下有很多好用的命令,今天这里介绍lsof 命令 lsof命令是什么? 可以列出被进程所打开的文件的信息.被打开的文件可以是 1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备 ...

  7. 小白需要知道的git命令

    小白需要知道的Git命令 git remote add origin(这里一般这样写,当然可以写别的) 之后写clone or download里复制来的东西,可以ssh或者https git rem ...

  8. [面试专题]前端需要知道的web安全知识

    前端需要知道的web安全知识 标签(空格分隔): 未分类 安全 [Doc] Crypto (加密) [Doc] TLS/SSL [Doc] HTTPS [Point] XSS [Point] CSRF ...

  9. 学vue前你需要知道的:vue生态圈

    文章目录 前言 Vue.js Vue Angular React Vuex Vue Router Devtools vue-cli img View UI(iView) Element(饿了么) 前言 ...

  10. 【技术】作为测试,你应该知道的MySQL知识(二)

    在上一文章<[技术干货]作为测试,你必须知道的MySQL知识(一)>中我们已经学了MySQL基础知识.对于最常用.最重要的select语句将会在本文与大家分享,带你轻松搞定查询语句. 一. ...

最新文章

  1. 100+人的企业IP怎么进行安全配置 ?
  2. 二叉排序树 -- 增删查改
  3. Mysql查询数据库状态及信息
  4. Windows Embedded CE 6.0开发初体验(四)跑个应用程序先
  5. Windows互斥锁的使用
  6. Windows安装Nacos单机集群
  7. freewitch测试信息-cdr
  8. 鱼眼相机矫正,按经纬度展开为环视图
  9. smb服务器速度测试_360路由器做smb服务器各种情况拷贝速度测试外加加装5g网卡...
  10. 电感的饱和电流 均方值电流 额定电流的认识
  11. 计算机的物理地址怎么写,电脑物理地址怎么查
  12. springmvc视图解析器详解
  13. 支付订单中未付款倒计时
  14. 几款软件界面模型设计工具
  15. 阿里在线笔试算法工程师附加题
  16. ABS系统类最新发表的论文趋势怎么看?
  17. 聚类生成anchor框的尺寸和比例
  18. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
  19. 三坐标检测基础知识之坐标系2021
  20. 《算法图解》学习笔记(十一):十种经典的算法与数据结构

热门文章

  1. xpadder教程:自定义设置游戏手柄的图片
  2. requests+正则表达式爬取猫眼电影TOP100!
  3. Drawable的setBounds方法
  4. PeopleSoft基础知识整理
  5. Unity - Timeline 之 Timeline window(Timeline窗口)
  6. JavaEE | 线程安全(锁、线程间通信、内存可见性、CAS、线程的状态)
  7. c语言切蛋糕题编程,切蛋糕问题.ppt
  8. debian 10 系统运行 uml 与网络配置
  9. 微信小程序自定义组件样式
  10. 本地计算机策略打不开怎么办,我的电脑的本地组策略编辑器怎么打不开?