很多情况下我们需要知道某条SQL语句的性能,都会通过EXPLAIN命令来查看查询优化器是如何执行的。

如何使用

使用EXPLAIN很简单,只需要在执行的SQL前面加上EXPLAIN即可

explain select s.sid sid, s.name studentName, s.age age, c.name className from student_class sc, student s, class c;

执行结果如下:

EXPLAIN中的列

EXPLAIN命令中经常使用到的列有id、

id

id是一个编号,标识SELECT所属的行。如果在语句当中没有子查询或联合查询,那么之后有唯一的SELECT,于是每一行在这个列中都显示1。否则,内层的SELECT语句一般会顺序编号,对应于其在语句中的位置。

  • SELECT列中子查询

  • FROM子句中的子查询

  • UNION查询

注意UNION结果总是放在一个匿名临时表中,之后MySQL将结果读取到临时表外。临时表不在原SQL中出现,因此它的id列是NULL

select_type

select_type列显示了对应行是简单还是复杂SELECT,具体如下:

select_type 描述
SIMPLE 简单查询,不包含任何复杂的子查询(FROM子句中的子查询除外)
PRIMARY 复杂查询
SUBQUERY 复杂查询,包含在SELECT列表中的SELECT标记为SUBQUERY
DERIVED 复杂查询,包含在FROM子句中的查询
UNION 复杂查询,在UNION查询中的第二个和随后的SELECT被标记为UNION
UNION RESULT 复杂查询,用来从UNION的匿名临时表检索结果的SELECT被标记为UNION RESULT
table

table列显示了对应行在访问哪个表。在通常情况下,它相当明了:它就是那个表,或是该表的别名。当FROM子句中有子查询或有UNION时,table列会变得复杂得多。

  • FROM子句中有子查询时,table列是<derivedN>,其中N是子查询的id
  • 当有UNION时,UNION RESULTtable列中包含一个参与UNIONid列表,如<union1,2>
type

type表示的是访问类型,也就是说MySQL决定如何查找表中的行。下面列表中依次从最差到最优

type 描述
ALL 全表扫描,从头到尾扫描整个表,效率最差
index 和全表扫描一样,只是MySQL扫描表时按索引次序进行而不是行,主要优点时避免了排序
range 范围扫描就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。BETWEENINOR都属于这类
ref 这是一种索引访问(索引查找),它返回所有匹配某个单个值的行。当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生
eq_ref 使用这种索引查找,MySQL知道最多只返回一条符合条件的记录。在使用主键或者唯一性索引查找时发生
const、system 当MySQL能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这种类型。如果通过将某一行的主键放入WHERE子句里的方式来选取次行的主键,MySQL就能帮这个查询转换为一个常量
NULL 意味着MySQL能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或索引。如从一个索引列里面选取最小值可以通过单独查找索引来完成,不需要在执行时访问表
possible_keys

possible_keys表示查询可能使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的

key

key显示了MySQL决定采用哪个索引来优化对表的访问。如果该索引没有出现在possible_keys列中,那么MySQL可能选择了一个覆盖索引,哪怕没有WHERE子句

key_len

key_len显示了MySQL在索引字段中可能的最大长度。当索引字段是多个时,长度为多个字段长度的和,每个字段的长度是根据定义的表结构中的长度来计算的

ref

ref显示了之前的表在key列记录的索引中查找值所用的列或常量。

rows

rows表示估计为了找到所需的行而要读取的行数。这个值越小越好

filtered

filtered显示的是针对表里符合某个条件的记录数的百分比所做的一个悲观估算。如果你把rows列和这个百分比相乘,就能看到MySQL估算它将和查询计划里面一个表关联的行数。

Extra

Extra包含的是不适合在其他列显示的额外信息。具体如下:

Extra 描述
Using index 意味着MySQL使用覆盖索引,避免访问表
Using where 意味着MySQL服务器将在存储引擎检索行后再进行过滤,并不是所有的WHERE条件查询都有
Using temporary 意味着MySQL在对查询结果排序时使用一个临时表
Using filesort 意味着MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行
Range checked for each record (index map: N) 这个值意味着没有好用的索引,新的索引将在联接的每一行上重新估算。工作中暂时没有遇到

以上内容如有描述错误的地方希望大家可以帮忙指出,一起交流学习!

MySQL中EXPLAIN命令详细解析的更多相关文章

  1. Mysql中explain命令查看语句执行概况

    Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain + 查询语句 例如:explain select * from user_info 几个重要的字段说明: t ...

  2. MySQL中EXPLAIN命令详解

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...

  3. MySQL的EXPLAIN命令用于SQL语句的查询执行计划

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  4. 对MySQL DELETE语法的详细解析

    以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...

  5. MS-DOS命令dir命令详细解析

    DOS命令窗口打开方式为Win+R键,打开运行命令,输入 cmd 即可:特殊情况我们要用管理员身份运行DOS,此时就可以在开始菜单-附件-DOS命令,鼠标右键单击命令提示符以管理员身份运行.如果是wi ...

  6. Linux中systemctl命令详细介绍

    Linux Systemctl是一个系统管理守护进程.工具和库的集合,用于取代System V.service和chkconfig命令,初始进程主要负责控制systemd系统和服务管理器.通过Syst ...

  7. mysql中explain的用法

    mysql中explain的用法 最近在做性能测试中经常遇到一些数据库的问题,通常使用慢查询日志可以找到执行效果比较差的sql,但是仅仅找到这些sql是不行的,我们需要协助开发人员分析问题所在,这就经 ...

  8. (转)linux应用之test命令详细解析

    linux应用之test命令详细解析 原文:https://www.cnblogs.com/tankblog/p/6160808.html test命令用法. 功能:检查文件和比较值 1)判断表达式 ...

  9. 详解MySQL中EXPLAIN解释命令

    Explain 结果解读与实践   基于 MySQL 5.0.67 ,存储引擎 MyISAM .   注:单独一行的"%%"及"`"表示分隔内容,就象分开“第一 ...

随机推荐

  1. Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题

    一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List<SalaryAdjustm ...

  2. 【XCTF】ics-04

    信息: 题目来源:XCTF 4th-CyberEarth 标签:PHP.SQL注入 题目描述:工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag 解题过程 进入注册页面,尝试注册: 进行登录 ...

  3. shell专题(十一):企业真实面试题(重点)

    11.1 京东 问题1:使用Linux命令查询file1中空行所在的行号 答案: [atguigu@hadoop102 datas]$ awk '/^$/{print NR}' sed.txt 问题2 ...

  4. selenium报错Element is not clickable at point及四种解决方法

    使用Selenium时,触发点击事件,经常报如下异常:Element is not clickable at point 1.未加载没加载出来就等待元素加载出来,再往下执行.可以使用python库ti ...

  5. python之爬虫(十) Selenium库的使用

    一.什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行 ...

  6. 蜂鸟E203系列——Linux调试(GDB+Openocd)

    欲观原文,请君移步 本文基于文章<蜂鸟E203系列--利用 Hbrid-E-SDK 环境开发程序> GDB 简介 GDB(GNU Project Debugger),是 GNU 工具链中的 ...

  7. Java常用API(Scanner类)

    Java常用API( Scanner类)1 1.Scanner类 首先给大家介绍一下什么是JavaAPI API(Application Programming Interface),应用程序编程接口 ...

  8. 面试官:请你说下N95应该怎么测试?这样回答让他竖起大拇指!

    随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行. 因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会. 但是因为求职者众多,很多面试官也开始想方设法 ...

  9. Oracle基础概述

    本部分主要参考”风哥“的Oracle入门视频. 一.体系结构概述 1.物理结构(文件结构) Oracle有四种文件:控制文件.数据文件.日志文件.参数文件 其中日志文件分为两类:联机日志文件.归档日志 ...

  10. TeamViewer如何绑定谷歌二次验证码/谷歌身份验证?

    1.下载TeamViewer,找到谷歌二次验证界面 下载.注册TeamViewer后,点击右上角账户名-“编辑配置文件” [常规]-“双重验证”,点“启用”   进入[激活双重验证]界面,点“启动激活 ...