(4) MySQL中EXPLAIN执行计划分析
一. 执行计划能告诉我们什么?
- SQL如何使用索引
- 联接查询的执行顺序
- 查询扫描的数据函数
二. 执行计划中的内容

SQL执行计划的输出可能为多行,每一行代表对一个数据库对象的操作
1. ID列
- ID列中的如果数据为一组数字,表示执行SELECT语句的顺序;如果为NULL,则说明这一行数据是由另外两个SQL语句进行 UNION操作后产生的结果集
- ID值相同时,说明SQL执行顺序是按照显示的从上至下执行的
- ID值不同时,ID值越大代表优先级越高,则越先被执行
演示

可以看到上面的执行计划返回了3行结果,id列的值可以看作是SQL中所具有的SELECT操作的序号
由于上述SQL中只有一个SELECT,所以id全为1,因此,我们就要按照由上至下读取执行计划
按照我们的SQL语句,我们会认为执行顺序是a,b,c,但是通过上图可以发现,Mysql并不是完成按照SQL中所写的顺序来进行表的关联操作的
执行对表的执行顺序为a,c,b,这是由于MySQL优化器会根据表中的索引的统计信息来调整表关联的实际顺序
2. SELECT_TYPE列
| 值 | 含义 |
|---|---|
| SIMPLE | 不包含子查询或是UNION操作的查询 |
| PRIMARY | 查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY |
| SUBQUERY | SELECT 列表中的子查询 |
| DEPENDENT SUBQUERY | 依赖外部结果的子查询 |
| UNION | Union操作的第二个或是之后的查询的值为union |
| DEPENDENT UNION | 当UNION作为子查询时,第二或是第二个后的查询的select_type值 |
| UNION RESULT | UNION产生的结果集 |
| DERIVED | 出现在FROM子句中的子查询 |
3. TABLE列
包含以下几种结果:
输出去数据行所在表的名称,如果表取了别名,则显示的是别名
<union M,N>: 由ID为M,N查询union产生的结果集
<derived N>/<subquery N> :由ID为N的查询产生的结果
4. PARTITIONS列:
查询匹配的记录来自哪一个分区
对于分区表,显示查询的分区ID
对于非分区表,显示为NULL
5. TYPE列
按性能从高至低排列如下:
| 值 | 含义 |
|---|---|
| system | 这是const联接类型的一个特例,当查询的表只有一行时使用 |
| const | 表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式 |
| eq_ref | 唯一索引或主键索引查询,对应每个索引键,表中只有一条记录与之匹配 |
| ref | 非唯一索引查找,返回匹配某个单独值的所有行 |
| ref_or_null | 类似于ref类型的查询,但是附加了对NULL值列的查询 |
| index_merge | 该联接类型表示使用了索引合并优化方法 |
| range | 索引范围扫描,常见于between、>、<这样的查询条件 |
| index | FULL index Scan 全索引扫描,同ALL的区别是,遍历的是索引树 |
| ALL | FULL TABLE Scan 全表扫描,这是效率最差的联接方式 |
6. Extra列
包含MySQL如何执行查询的附加信息
| 值 | 含义 |
|---|---|
| Distinct | 优化distinct操作,在找到第一个匹配的元素后即停止查找 |
| Not exists | 使用not exists来优化查询 |
| Using filesort | 使用额外操作进行排序,通常会出现在order by或group by查询中 |
| Using index | 使用了覆盖索引进行查询 |
| Using temporary | MySQL需要使用临时表来处理查询,常见于排序,子查询,和分组查询 |
| Using where | 需要在MySQL服务器层使用WHERE条件来过滤数据 |
| select tables optimized away | 直接通过索引来获得数据,不用访问表,这种情况通常效率是最高的 |
7. POSSIBLE_KEYS列
- 指出MySQL能使用哪些索引来优化查询
- 查询列所涉及到的列上的索引都会被列出,但不一定会被使用
8. KEY列
- 查询优化器优化查询实际所使用的索引
- 如果表中没有可用的索引,则显示为NULL
- 如果查询使用了覆盖索引,则该索引仅出现在Key列中
9. KEY_LEN列
显示MySQL索引所使用的字节数,在联合索引中如果有3列,假如3列字段总长度为100个字节,Key_len显示的可能会小于100字节,比如30字节,这就说明在查询过程中没有使用到联合索引的所有列,只是利用到了前面的一列或2列
- 表示索引字段的最大可能长度
- Key_len的长度由字段定义计算而来,并非数据的实际长度
10. Ref列
- 表示当前表在利用Key列记录中的索引进行查询时所用到的列或常量
11. rows列
- 表示MySQL通过索引的统计信息,估算出来的所需读取的行数(关联查询时,显示的是每次嵌套查询时所需要的行数)
- Rows值的大小是个统计抽样结果,并不十分准确
12. Filtered列
- 表示返回结果的行数占需读取行数的百分比
- Filtered列的值越大越好(值越大,表明实际读取的行数与所需要返回的行数越接近)
- Filtered列的值依赖统计信息,所以同样也不是十分准确,只是一个参考值
三. 执行计划的限制
- 无法展示存储过程,触发器,UDF对查询的影响
- 无法使用EXPLAIN对存储过程进行分析
- 早期版本的MySQL只支持对SELECT语句进行分析
(4) MySQL中EXPLAIN执行计划分析的更多相关文章
- 学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难
上篇文章讲了MySQL架构体系,了解到MySQL Server端的优化器可以生成Explain执行计划,而执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天就一块学习Explain执 ...
- MySQL中的执行计划explain
一.用法及定义: explain为sql的执行计划.在sql前面加上explain关键字即可 如:explain select * from tbl_emp; 名词解释: id:[操作表的顺序] 1. ...
- MySQL之EXPLAIN 执行计划详解
explain 可以分析 select 语句的执行,即 MySQL 的“执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好): | All | index ...
- [转]两表join的multi update语句在MySQL中的执行流程分析
出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...
- MySQL优化-》执行计划和常见索引
MySql的explain执行计划 explain是一个Mysql性能显示的工具,它显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.在开发当 ...
- MySQL学习系列2--MySQL执行计划分析EXPLAIN
原文:MySQL学习系列2--MySQL执行计划分析EXPLAIN 1.Explain语法 EXPLAIN SELECT …… 变体: EXPLAIN EXTENDED SELECT …… 将执行 ...
- MySQL学习系列2--MySQL执行计划分析EXPLAIN [原创]
1.Explain语法 EXPLAIN SELECT …… 变体: EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可 ...
- MySQL性能分析, mysql explain执行计划详解
MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...
- MySql——Explain执行计划详解
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...
随机推荐
- 想要进步,就要阅读大神的博客,再推荐一波springmvc映射路径之url的action请求
http://www.cnblogs.com/liukemng/p/3726897.html
- Ucinet6 + Netdraw 根据excel文件绘制网络拓扑图
条件: 具备Ucinet6 和 Netdraw 两款软件的Windows excel文件格式(.xlsx .xls .csv):必须是数字,如果现有的文件不是数字,可以采用某种编码的方式将其映射成 ...
- python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)
python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...
- springboot springcloud 父项目pom工程创建pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- python的常用模块之collections模块
python的常用模块之collections模块 python全栈开发,模块,collections 认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文 ...
- 增强for 可以用于ArrayList
ArrayList<Integer> list=null; for(int i : list){ sum+=i; }
- NIO的通道和缓冲区
概述 通道和缓冲区是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们. 通道是对原I/O包中的流的模拟.到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象.一个B ...
- 自己总结的C#编码规范--前言&目录
最近在为公司编写c#编码规范,以前对这方面研究不多,只是觉得代码能够出自己的意思就可以了. 我参考了以下资料 C# Coding Conventions NET设计规范约定惯用法与模式(第2版) 编写 ...
- jQuery Ajax -附示例
jQuery其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能. jQuery 不是生产者,而是大自然搬运工. jQuery Aja ...
- 618大促微服务、web、redis等的超时时间
1. 最近因为大促原因线上服务不稳定,不稳定主要是redis经常超时并且数据为定时mGet方式获得 节点一多,所有服务节点同时获取数据访问量变大导致get取数据变慢因mGet会对数据进行锁住操作, 此 ...