面试前必须知道的MySQL命令【explain】
前言
只有光头才能变强
刷面试题的时候,不知道你们有没有见过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列是 <derivenN>
格式,表示当前查询依赖 id=N
的查询,于是先执行 id=N
的查询
1.3.4type
该列称为关联类型或者访问类型,它指明了MySQL决定如何查找表中符合条件的行,同时是我们判断查询是否高效的重要依据。
以下为常见的取值
- ALL:全表扫描,这个类型是性能最差的查询之一。通常来说,我们的查询不应该出现 ALL 类型,因为这样的查询,在数据量最大的情况下,对数据库的性能是巨大的灾难。
- index:全索引扫描,和 ALL 类型类似,只不过 ALL 类型是全表扫描,而 index 类型是扫描全部的索引,主要优点是避免了排序,但是开销仍然非常大。如果在 Extra 列看到 Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要少很多。
- range:范围扫描,就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。这个类型通常出现在
=、<>、>、>=、<、<=、IS NULL、<=>、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 Explain 命令详解:
- mysql系列_explain执行计划:
- MySQL explain详解
如果你觉得我写得还不错,了解一下:
- 坚持原创的技术公众号:Java3y。回复 1 加入Java交流群
- 文章的目录导航(精美脑图+海量视频资源):
面试前必须知道的MySQL命令【explain】的更多相关文章
- [转] 29个你必须知道的Linux命令
总结: 1. find 查找文件 2. grep 查找某个文件或者文件夹里面文件的内容 29个你必须知道的Linux命令 虽然Linux发行版支持各种各样的GUI(graphical user in ...
- Java面试——你必须知道的122题
1.Java面向对象中所有类的最终基类是什么? 参考答案 object,所有类都默认最终继承object,object是所有类的基类 2.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语 ...
- 29个你必须知道的Linux命令
虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的.Bash和 Linux Shell ...
- Linux管理员必须知道的sudo命令
"Sudo"是Unix/Linux平台上的一个很实用的工具,它同意系统管理员分配给普通用户一些合理的"权利",让他们执行一些仅仅有超级用户或其它 特许用户才干完 ...
- 你必须知道的MySQL知识点
什么是索引 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构(掌握) 数据结构可视化 前置知识:树的高度越低查询效率越高 二叉树:不能自平衡,极端情况出现倾斜,查询效率和链表类似 红黑 ...
- Apktool(2)——使用前必须知道的apk知识
这里拿testapp.apk为例,如下图所示,左图为直接解压apk得到的文件,右图为apktool反编译得到的文件(反编译的使用在下一篇重点介绍) 图1 解压apk和反编译apk得到的文件目录对比 一 ...
- (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验
转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验 阅读目录 [本文已下咒.先顶后看,会涨 ...
- 《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述
开放封闭原则(OCP,Open Closed Principle)是面向对象原则的核心.由于软件设计本身所追求的墓边就是封装变化,降低耦合,而开放封闭原则就是对这一目标的直接体现.(你必须知道的.NE ...
- 《jQuery风暴》第2章 必须知道的JavaScript知识
第2章 必须知道的JavaScript知识 JavaScript是jQuery应用的基础,掌握JavaScript这门语言是使用jQuery的基础条件.本章不会全面细致的讲解JavaScript的全部 ...
随机推荐
- C# 使用SmtpClient发送Email
使用Winfrom写的报错信息发送邮件通知. 以下主要代码 /// <summary> /// 发送邮件核心代码 /// </summary> /// <param na ...
- AUTOSAR-关于配置文件的思考
基于Can: 1. Can_Cfg.h contains compile time configurations. It should be included by Can.h which is sp ...
- 重温《STL源码剖析》笔记 第一章
源码之前,了无秘密. --侯杰 经典的书,确实每看一遍都能重新收获一遍: 第一章:STL简介 STL的设计思维:对象的耦合性极低,复用性极高,符合开发封闭原则的程序库. STL的价值:1.带给我们一套 ...
- Sublime中文编码问题
1. 改配置 Preferences->Settings 三个全部加上 "default_encoding": "UTF-8" 2. 代码编写 2.1 ...
- 洛谷 P2587 解题报告
P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...
- Runc 简介
RunC 是什么? RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好.我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器.事实上,r ...
- Java NIO SocketChannel套接字通道
原文链接:http://tutorials.jenkov.com/java-nio/socketchannel.html 在Java NIO体系中,SocketChannel是用于TCP网络连接的套接 ...
- 计算器源码(数学式python)
''' ******************** 请计算表达式: 1 - 2 * ( (60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...
- NRPE介绍
一.简介 1.NRPE介绍 NRPE是Nagios的一个功能扩展,它可在远程Linux/Unix主机上执行插件程序.通过在远程服务器上安装NRPE插件及Nagios插件程序来向Nagios监控平台提供 ...
- maven入门 (二)_私服安装与上传下载
本篇文章主要介绍maven的私服安装和 jar包的上传与下载.毕竟大家还是在公司需要上传jar包到自己公司私服的. 1.安装私服 下载链接: https://pan.baidu.com/s/17dbQ ...