EXPLAIN执行计划中要重点关注哪些要素
MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息。
总的来说,我们只需要关注结果中的几列:
| 列名 | 备注 |
|---|---|
| type | 本次查询表联接类型,从这里可以看到本次查询大概的效率 |
| key | 最终选择的索引,如果没有索引的话,本次查询效率通常很差 |
| key_len | 本次查询用于结果过滤的索引实际长度,参见另一篇分享(FAQ系列-解读EXPLAIN执行计划中的key_len) |
| rows | 预计需要扫描的记录数,预计需要扫描的记录数越小越好 |
| Extra | 额外附加信息,主要确认是否出现 Using filesort、Using temporary 这两种情况 |
首先看下 type 有几种结果,分别表示什么意思:
| 类型 | 备注 |
|---|---|
| ALL | 执行full table scan,这事最差的一种方式 |
| index | 执行full index scan,并且可以通过索引完成结果扫描并且直接从索引中取的想要的结果数据,也就是可以避免回表,比ALL略好,因为索引文件通常比全部数据要来的小 |
| range | 利用索引进行范围查询,比index略好 |
| index_subquery | 子查询中可以用到索引 |
| unique_subquery | 子查询中可以用到唯一索引,效率比 index_subquery 更高些 |
| index_merge | 可以利用index merge特性用到多个索引,提高查询效率 |
| ref_or_null | 表连接类型是ref,但进行扫描的索引列中可能包含NULL值 |
| fulltext | 全文检索 |
| ref | 基于索引的等值查询,或者表间等值连接 |
| eq_ref | 表连接时基于主键或非NULL的唯一索引完成扫描,比ref略好 |
| const | 基于主键或唯一索引唯一值查询,最多返回一条结果,比eq_ref略好 |
| system | 查询对象表只有一行数据,这是最好的情况 |
上面几种情况,从上到下一次是最差到最好。
再来看下Extra列中需要注意出现的几种情况:
| 关键字 | 备注 |
|---|---|
| Using filesort | 将用外部排序而不是按照索引顺序排列结果,数据较少时从内存排序,否则需要在磁盘完成排序,代价非常高,需要添加合适的索引 |
| Using temporary | 需要创建一个临时表来存储结果,这通常发生在对没有索引的列进行GROUP BY时,或者ORDER BY里的列不都在索引里,需要添加合适的索引 |
| Using index | 表示MySQL使用覆盖索引避免全表扫描,不需要再到表中进行二次查找数据,这是比较好的结果之一。注意不要和type中的index类型混淆 |
| Using where | 通常是进行了全表/全索引扫描后再用WHERE子句完成结果过滤,需要添加合适的索引 |
| Impossible WHERE | 对Where子句判断的结果总是false而不能选择任何数据,例如where 1=0,无需过多关注 |
| Select tables optimized away | 使用某些聚合函数来访问存在索引的某个字段时,优化器会通过索引直接一次定位到所需要的数据行完成整个查询,例如MIN()\MAX(),这种也是比较好的结果之一 |
再说下,5.6开始支持optimizer trace功能,看样子在执行计划方面是要逐渐和ORACLE看齐 :)
EXPLAIN执行计划中要重点关注哪些要素的更多相关文章
- [转载] EXPLAIN执行计划中要重点关注哪些要素
原文: https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=400738936&idx=1&sn=2910b4119b9 ...
- EXPLAIN执行计划中要重点关注哪些要素(叶金荣)
原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORA ...
- EXPLAIN执行计划中要重点关注哪些要素(转)
EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: ...
- 解读EXPLAIN执行计划中的key_len(转)
原文:http://imysql.com/2015/10/20/mysql-faq-key-len-in-explain.shtml 导读 EXPLAIN中的key_len一列表示什么意思,该如何解读 ...
- FAQ系列 | 解读EXPLAIN执行计划中的key_len
http://imysql.com/2015/10/20/mysql-faq-key-len-in-explain.shtml
- (4) MySQL中EXPLAIN执行计划分析
一. 执行计划能告诉我们什么? SQL如何使用索引 联接查询的执行顺序 查询扫描的数据函数 二. 执行计划中的内容 SQL执行计划的输出可能为多行,每一行代表对一个数据库对象的操作 1. ID列 ID ...
- 【夯实Mysql基础】mysql explain执行计划详解
原文地址 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- mysql explain执行计划详解
1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:simp ...
随机推荐
- 找出n个自然数(1,2,3,……,n)中取r个数的组合
<?php /** * 对于$n和$r比较小, 可以用这种方法(当n=5, r=3时) */ function permutation1($n, $r) { for($i=1; $i<=$ ...
- JavaScript ES6格式化字符串方法
js想要动态更新文本内容,在ES5中没有格式化字符串的方法,在ES6中是有字符串格式化的方法的. 使用左上角数字1旁边的符号定义字符串.先定义好需要拼接的字符串,在字符串内部使用 ${变量名} 进行拼 ...
- Linux audit安全审计工具
/********************************************************************** * Linux audit安全审计工具 * 说明: * ...
- tshark CAN协议分析初试
/********************************************************************************* * tshark CAN协议分析初 ...
- Bigining
今天,我的第一个软件工程项目团队组建成功,找到了自己的队友. 从现在开始就要分析和构思项目的具体内容.
- html播放音乐
如何在网站网页中添加音乐代码 告诉你多种格式文件的详细使用代码. width_num——指定一个作为宽度的数字: height_num——指定一个作为高度的数字: 1.mp3 ...
- C#动态创建Xml-LinQ方式
C#创建Xml-LinQ方式 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- File available()方法
File类中的length()方法与IO中InputStream类中的available()方法功能重复? 只是返回值类型不同 前者返回long后者返回int 但本质上都一样表示文件的字节数 a ...
- github如何删除新建仓库(致新手)
github作为开发人员的必备用具.那么,作为一个新手如何删除github中建立的仓库呢? 1.以删除My test为例
- jquery选择后代以及toggle,toggleClass用法
$("#id").find(".classname") 选择id为xx下的类名为xx的元素 toggle $(this).next(".c ...