MySQL的Explain命令


- EXPLAIN EXTENDED。它会通知服务器"逆向编译"执行计划为一个SELECT语句。可以通过紧接其后运行SHOW WARNINGS看到这个生成的语句。这个语句直接来自执行计划,而不是原SQL语句,到这点上已经变成一个数据结构。在大部分场景下它都与原语句不相同。(结果输出添加了filterd列)
- EXPLAIN PARTITIONS。它会显示查询将访问的分区,如果查询是基于分区表的话。 (结果输出添加了partitions列)
- EXPLAIN不会告诉你触发器、存储过程或UDF会如何影响查询。
- EXPLAIN 不支持存储过程,尽管可以手动抽取查询并单独对其进行EXPLAIN操作。
- EXPLAIN不会告诉你MySQL在查询执行中所做的特定优化。
- EXPLAIN不会显示关于查询的执行计划的所有信息。
- EXPLAIN不区分具有相同名字的事物。例如,它对内存排序和临时文件都使用"filesort",并且对于磁盘上和内存中的临时表都显示"Using temporary"。
SIMPLE | 该查询不包括子查询和UNION。 |
PRIMARY | 复杂SELECT的最外层行。 |
SUBQUERY |
包含在SELECT 列表中的子查询中的select(简单子查询)。
SUBQUERY还可被标记为DEPENDENT,DEPENDENT SUBQUERY 意味着SELECT依赖于外层查询中发现的数据。
|
DERIVED |
包含在FROM子句的子查询中的SELECT 。
MySQL会递归执行并将结果放到一个临时表中。服务器内部称其"派生表",因为该临时表是从子查询中派生出来的。
|
UNION |
在UNION中的第二个和随后的SELECT 。
第一个SELECT被标记就好像它以部分外查询来执行。如果UNION被FROM子句中的子查询包含,那么它的第一个SELECT会被标记为DERIVED 。
UNION还可被标记为UNCACHEABLE。UNCACHEABLE UNION 意味着SELECT中的某些特性阻止结果被缓存与一个Item_cache中。
|
UNION RESULT | 用来从UNION的匿名临时表检索结果的SELECT。 |

.png)
ALL |
全表扫描,通常意味着MySQL必须扫描整张表,从头到尾,去找到需要的行。
这里也有个例外,例如在查询里使用了LIMIT,或者在Extra列中显示"Using distinct/not exists"。
|
index |
这个跟全表扫描一样,只是MySQL扫描表是按索引次序进行而不是行。它的主要优点是避免了排序;最大的缺点是要承担按索引次序读取整个表的开销。这通常意味着若是按随机次序访问行,开销将会非常大。
如果在Extra列种看到"Using index",说明MySQL正在使用覆盖索引,它只扫描索引的数据,而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少很多。
|
range |
范围扫描时一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。
这比全索引扫描好一些,因为它用不着遍历全部索引。显而易见的范围扫描是带有BETWEEN或在WHERE子句里带有>的查询。
当MySQL使用索引去查找一系列值时,例如IN()和OR列表,也会显示为范围扫描。然而,这两者其实是相当不同的访问类型,在性能上有主要的差异。
此类扫描的开销跟索引类型相当。
|
ref |
这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值得行。然而,它可能会找到多个符合条件的行,因此,它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀才会发生。把它叫做ref是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询前一个表里的结果值。
ref_or_null是ref之上的一个变体,它意味着MySQL必须在初次查找的结果。
|
eq_ref |
使用这种索引查找,MySQL知道最多只返回一条符合条件的记录。
这种访问方法可以在MySQL使用主键或者唯一性索引查找时看到,它会将他们与某个参考值作比较。MySQL对于这类访问类型的优化坐的非常好,因为它知道无需估计匹配行的范围或在找到匹配行后再继续查找。
|
const, system |
当MySQL能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。
例如,如果你通过将某一行的主键放入where子句里的方式来选取此行的主键,MySQL就能把这个查询转换为一个常量。然后就可以高效地将表从联接执行中移除。
|
NULL |
这种访问方式意味着MySQL能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引。
例如,从一个索引列里选取最小值可以通过单独查找索引来完成,不需要执行时访问表。
|
Using index | 此值表示MySQL将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型混淆。 |
Using where | 这意味着MySQL服务器将在存储引擎检索行后再进行过滤。许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示"Using where"。有时"Using where"的出现就是一个暗示:查询可受益于不同的索引。 |
Using temporary | 这意味着MySQL在对查询结果排序时会使用一个临时表。 |
Using filesort | 这意味着MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。MySQL有两种文件排序算法。两种方式都可以在内存或磁盘上完成。但EXPLAIN无法知晓MySQL将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。 |
Range checked for each record(index map: N) | 这个值意味着没有好用的索引,新的索引将在联接的每一行上重新估算。N是显示在possible_keys列种索引的位图,并且是冗余的。 |
MySQL的Explain命令的更多相关文章
- MySQL的EXPLAIN命令用于SQL语句的查询执行计划
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
- Mysql中explain命令查看语句执行概况
Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain + 查询语句 例如:explain select * from user_info 几个重要的字段说明: t ...
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*去检索表.给常常使用的列建立索引.还有创建 ...
- 【MySQL】EXPLAIN命令详解
具体参考: https://www.cnblogs.com/gomysql/p/3720123.html 原文如下: 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么 ...
- MySQL优化Explain命令简介(一)
最近碰到MySQL需要写入大量数据并查询的场景,于是学习了一下MySQL的查询优化,想找关于explain命令的详细资料,然而网上并没有找全,最后终于在<高性能MySQL>中找到了对这一命 ...
- MySQL中EXPLAIN命令详细解析
很多情况下我们需要知道某条SQL语句的性能,都会通过EXPLAIN命令来查看查询优化器是如何执行的. 如何使用 使用EXPLAIN很简单,只需要在执行的SQL前面加上EXPLAIN即可 explain ...
- mysql数据库explain命令用法详解
本文转自一位前辈的文章,感觉写得很好,就转过来了.这个是那位前辈的原文地址:http://www.111cn.net/database/mysql/81698.htm 当我们在优化SQL时,想看 ...
- MySQL中EXPLAIN命令详解
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- MySQL的EXPLAIN命令详解(转)
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
随机推荐
- malloc和new的区别
(1)malloc在C和C++中都可以使用,用来申请一段内存:申请的内存一定要用free释放,然后把指针置为null: new只能在C++中使用,用于动态内存分配:new的对象要delete掉: (2 ...
- SQL Server 的通用分页显示存储过程
建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适 ...
- [deviceone开发]-纳豆项目源码开源
一.简介 已上线的纳豆项目开源.这个App做的非常好,细节处理的很流畅,使用了很多小的动画效果,极力推荐,很多功能可以从这个应用中获取代码和灵感. 二.效果图 三.相关下载 androi ...
- 避开unity的坑(转摘)
避开unity的坑(转摘) 以下总结一部分来自经验之谈,一部分来自其他人的分享.总的来讲,unity开发原型和效果.验证想法,确实是无比便利.可能一个月就把核心玩法做得差不多.强大的编辑器功能让我们也 ...
- 第一次写jquery插件,来个countdown计时器吧
之前同学做个购物商城秒杀活动需要计时器的功能,在用jquery提供的countdown插件时,一直报错,貌似还需要依赖除jquery之外的其他插件,搞了半天也没搞成功,就叫我帮忙写个.然而我并没有写过 ...
- C#各种数组直接的数据复制/转换
之前做Opengl程序,用的的C#的SharpGL这个库,里面有各种奇怪绑定的函数,比如原型为: void glInterleavedArrays(uint format, int stride, v ...
- 编译安装mysql(Ubuntu10 64位)
选用较好的编译器和较好的编译器选项,这样应用可提高性能10-30%,这个对大多数程序都非常重要 Mysql的编译,不同的版本具体的配置方式是有差别的 旧版的配置形式参考 这个形式主要是使用config ...
- 计算c字符的长度,保证不超过2^30
来自sqlite3源码 /* ** Compute a string length that is limited to what can be stored in ** lower 30 bits ...
- Swift tour
输出函数: print(“hello world!") 无需引入函数库,无须使用“;”作为语句结尾,也无须写跟其它语言一样的main()函数,Swift中,全局区的代码就是程序入口.You ...
- Android 手机卫士--实现设置界面的一个条目布局结构
本文地址:http://www.cnblogs.com/wuyudong/p/5908986.html,转载请注明源地址. 本文以及后续文章,将一步步完善功能列表: 要点击九宫格中的条目,需要注册点击 ...