本文转自一位前辈的文章,感觉写得很好,就转过来了。这个是那位前辈的原文地址:http://www.111cn.net/database/mysql/81698.htm 
 
当我们在优化SQL时,想看看自己写的SQL的执行效率问题,MySql给我们提供一个命令explain,可以显示我们所写的SQL效率。

一个常见的理解错误:mysql在执行explain时不会执行sql语句,事实上如果查询的from字段有子查询,explain会执行子查询。

explain只能解释select查询,对update,delete,insert需要重写为select。

下面就explain的各个字段分别解释。

1.id

当sql语句中有子查询和关联查询时会显示多列,id用于标志多列数据。

2.select_type

用于表示是简单还是复杂的查询,不包括子查询和union的查询为简单查询。如果查询中有任何复杂的部分,外层查询标记为primary。复杂查询分为四大类(SUBQUERY,DERIVED,UNION,UNION RESULT)
(1)SUBQUERY:包含在select列表中的子查询中的select,不在from子句中的select
(2)DERIVED:表示包含在from子句中的select。mysql会递归的执行并将结果放在一个临时表中,服务器内部称其为“派生表”
(3)UNION:在union中第二个和随后的select被标记为union。
(4)UNION RESULT:用来在UNION产生的匿名临时表检索结果的select被标记为union result
综上,select_type共有SIMPLE,PRIMARY,SUBQUERY,DERIVED,UNION,UNION RESULT 六种常见情况。

3.table

一般情况下为表名,当from子句中有子查询或者union时,table列会变得复杂的多,在这种情况下,
mysql会创建匿名的临时表,这种情况下,table列为**derived N**的形式,其中N时子查询的id。
当有UNION时,UNION RESULT的table列包含一个参与UNION的id列表,形为**union1,3**

4.type

访问类型mysql决定如何查找表中的行,从最差到最优依次如下:
(1)ALL:全表扫描,通常意味着mysql必须扫描整张表,从头到尾去找到所需要的行。
(2)index:这和全表扫描一样,只是mysql在扫描表示按索引次序进行而不是行,他的主要优点是避免了排序,最大的缺点是承担按索引次数读取整张表的开销。如果Extra字段看到Using index,说明Mysql正在使用覆盖索引,他比按索引次序全表扫描开销要少得多。
(3)range:范围扫描就是一个有限制的索引扫描,它开始于索引的某一点,返回匹配这个值域的行。这比全索引扫描要好一些,因为它用不着遍历全部索引。显而易见的范围扫描时带有between或者where>,当mysql使用索引去查找in()和or时也会显示range。但是这两者在性能上有很重要的差异。
(4)ref:这是一种索引访问(索引查找),它返回所有匹配某个单个值得行,然而它可能找到多个符合条件的行,因此它是查找和扫描的混合体。此类索引的扫描只有在使用非唯一索引或者唯一索引的非唯一前缀时才发生。
(5)eq_ref:使用这种索引查找,mysql最多只返回一条记录。这种访问方法在使用mysql主键或者唯一索引查找时看到。它会将他们与某个参考值作比较。
(6)const,system 当mysql能够从某部分进行优化将其转换为一个常量时,它就会使用这些访问类型。比如如下查询:explain select id from mis_audit_comment where id = 1\G;
(7)NULL 这种访问方式意味着Mysql能在优化阶段分解查询语句,在执行阶段甚至用不着访问表和索引。

5.possible_key

显示查询可以使用的索引。

6.key

显示mysql决定使用哪个索引来优化对表的访问。

7. key_len

mysql在索引里使用的字节数,可以根据key_len计算出该索引正在使用哪些列。可以根据key_len查看sql语句使用联合索引的情况。当有多列索引(audit_status,status,create_time)时,key_len为2时,表示只用了第一个为small int的索引。

8.ref

显示table在key中选取的索引中查找值所用的列或者常量。
9.row

mysql估计为了找到所需的行而要读取的行数。是mysql认为它要检查的行数,而不是结果集里的行数。

10.Extra

记录了不适合在其他列中显示的额外信息

(1)Using index:mysql将使用覆盖索引,以避免访问表。
(2)Using where:mysql服务器将在存储引擎检索行后再进行过滤。
(3)Using temporary:mysql在对结果排序时使用了临时表
(4)Using filesort:表示mysql使用一个外部索引排序,而不是按索引的顺序读取表。

mysql数据库explain命令用法详解的更多相关文章

  1. Mysql数据库导入命令Source详解

    Mysql数据库导入命令Source详解 几个常用用例: 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p dat ...

  2. Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

  3. [转]Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

  4. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  5. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...

  6. Ubuntu kill命令用法详解

    转自:Ubuntu kill命令用法详解 1. kill   作用:根据进程号杀死进程   用法: kill [信号代码] 进程ID   root@fcola:/# ps -ef | grep sen ...

  7. install 命令用法详解

    install 命令用法详解 http://man.linuxde.net/install install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似 ...

  8. Mysql中limit的用法详解

    Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...

  9. Linux下find命令用法详解

    Linux下find命令用法详解   学神VIP烟火 学神IT教育:XueGod-IT   最负责任的线上直播教育平台   本文作者为VIP学员 烟火   第一部分:根据文件名查找   1.在当前目录 ...

随机推荐

  1. 1. node.js 认识 (一)

    官网: (下载安装nodejs) https://nodejs.org/en/ http://nodejs.cn/ Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环 ...

  2. java学习之路--简单基础的面试题

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...

  3. 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree

    题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...

  4. 让我对 docker swarm mode 的基本原理豁然开朗的几篇英文博文

    关于 docker swarm mode 的基本架构 How does it work? Docker! Part 1: Swarm general architecture 关于 Overlay N ...

  5. fiddler的一些记录

    通过execaction.exe可以给fiddler发命令,控制抓包开始和停止 https://stackoverflow.com/questions/29916508/start-and-stop- ...

  6. 补齐-Django之Model操作

    http://www.cnblogs.com/wupeiqi/articles/6216618.html

  7. ssl证书

    个人理解: 客户端第一次连接服务端的时候,服务端就把证书(中的公钥)给了客户端,客户端验证证书中的公钥是否和本地的公钥一致(客户端一般都会内置类似AC的具有公信力的证书颁发机构), 之后的请求每次请求 ...

  8. ADB命令(全)

    当熟悉Shell命令的人使用adb是没有任何难度的,因为adb中绝大多少命令都是引用的shell命令 以下命令进行归类,红色部分字体是测试人员常用的adb命令 基础命令 1.启动adb服务 adb s ...

  9. javaweb(1)之tomcat使用

    安装 1.点击下载. 2.解压到一个目录. 3.进入解压后的 bin 目录,双击该文件夹下的 startup.bat 即可运行. 4.若运行成功,会有一个窗口悬停如下: 访问地址: localhost ...

  10. Angela启动步骤

    1.在web目录下执行 grunt watch (如果不在目录下执行不能识别,当然首先安装node.js) 2.随便改一个文件,会自动重新生成代码(在dest目录下会生成可执行的代码) 3.如果有de ...