MySQL EXPLAIN 命令: 查看查询执行计划
MySQL 的 EXPLAIN 命令可以查看SELECT语句的执行的计划,是 MySQL 查询优化的必备工具。
通过执行计划可以了解查询方式、索引使用情况、需要扫描的数据量以及是否需要临时表或排序操作等信息。
我们需要分析执行计划对查询进行有的放矢的优化。
需要注意:
- EXPLAIN不考虑触发器、存储过程或用户自定义函数对查询的影响
- EXPLAIN不考虑缓存
- EXPLAIN只能分析执行计划,不能显示存储引擎在执行查询过程中进行的操作
- 部分统计信息是估算的,并非精确值
本文基于 MySQL 5.6 版本。
EXPLAIN SELECT * FROM `user`
JOIN `post` ON `user`.id = `post`.uid
WHERE user.`created_at` < '2018-10-01 00:00:00' AND `post`.status = 1;
结果:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | user | range | PRIMARY,idx_created_at | idx_created_at | 7 | null | 19440 | Using index condition; Using where; Using temporary; Using filesort |
| 1 | SIMPLE | post | ref | idx_uid,idx_status | idx_uid | 8 | user.id | 1 | Using where |
EXPLAIN 的行数为查询涉及的表数, 结果各列的含义为:
- id: 查询的唯一标识
- select_type: 查询的类型
- table: 查询的表, 可能是数据库中的表/视图,也可能是 FROM 中的子查询
- type: 搜索数据的方法
- possible_keys: 可能使用的索引
- key: 最终决定要使用的key
- key_len: 查询索引使用的字节数。通常越少越好
- ref: 查询的列或常量
- rows: 需要扫描的行数,估计值。通常越少越好
- extra: 额外的信息
select type
select_type 可能的值有:
- SIMPLE: 简单查询,不包含子查询和union
- PRIMRARY: 包含子查询时的最外层查询; 使用union时的第一个查询
- UNION: 包含union的查询中非第一个查询
- DEPENDENT UNION: 与 UNION 相同,但依赖外层查询的结果
- SUBQUERY: 子查询
- DEPENDENT SUBQUERY: 依赖外层查询的子查询
- DERIVED: 用于 FROM 中的子查询
下面给出几个示例:
EXPLAIN SELECT * FROM post WHERE uid = (
SELECT id FROM user WHERE name = "finley"
);
| id | select_type | table |
|---|---|---|
| 1 | PRIMARY | post |
| 2 | SUBQUERY | user |
DEPENDENT SUBQUERY:
EXPLAIN SELECT * FROM post WHERE uid = (
SELECT id FROM user WHERE name = "finley" AND post.uid=user.id
);
| id | select_type | table |
|---|---|---|
| 1 | PRIMARY | post |
| 2 | DEPENDENT SUBQUERY | user |
type
type 字段描述了查询的方式,从好到坏为:
null: 不需要访问索引和表即可完成, 示例:
SELECT 1;const: 表中仅有一行匹配,在分解查询计划时直接将其读出作为常量使用。system 是 const 类型的特例。
示例:SELECT id FROM user WHERE name = "hdt3213";id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE user const uni_name uni_name 258 const 1 Using index
UNIQUE KEY uni_name (name) ON user
eq_ref: 使用 PRIMARY KEY 或 UNIQUE KEY 进行关联查询。
示例:SELECT * FROM post JOIN user ON post.uid = user.id WHERE user.gender = 'M';id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE post ALL idx_uid 0 0 0 57796 null 1 SIMPLE user eq_ref PRIMARY PRIMARY 8 post.uid 1 Using where ref: 使用允许重复的索引进行查询
示例:SELECT * FROM user WHERE phone='12345678901';id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE user ref idx_phone idx_phone 259 const 1 Using index condition range: 使用索引进行范围查询:
示例:SELECT * FROM user WHERE age>18;id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE user ref idx_age idx_age 259 const 1 null index: 在索引上进行顺序扫描。常见于在多列索引中未使用最左列进行查询。
示例:SELECT * FROM user WHERE last_name='smith'id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE user ref idx_full_name idx_full_name 259 const 1 Using where all: 扫描全表,最坏的情况
extra
extra 列显示了查询过程中需要执行的其它操作,有些情况应尽力避免。
- using filesort: 查询时执行了排序操作而无法使用索引排序。虽然名称为'file'但操作可能是在内存中执行的,取决是否有足够的内存进行排序。
应尽量避免这种filesort出现。 - using temporary: 使用临时表存储中间结果,常见于ORDER BY和GROUP BY语句中。临时表可能在内存中也可能在硬盘中,应尽量避免这种操作出现。
- using index: 索引中包含查询的所有列不需要查询数据表(回表)。可以加快查询速度。
- using where: 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给客户端
- using index condition: 索引条件推送(MySQL 5.6 新特性),服务器层将不能直接使用索引的查询条件推送给存储引擎,从而避免在服务器层进行过滤。
- distinct: 优化distinct操作,查询到匹配的数据后停止继续搜索
MySQL EXPLAIN 命令: 查看查询执行计划的更多相关文章
- Mysql中explain命令查看语句执行概况
Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain + 查询语句 例如:explain select * from user_info 几个重要的字段说明: t ...
- MySQL的EXPLAIN命令用于SQL语句的查询执行计划
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
- MySQL 优化之EXPLAIN详解(执行计划)
学习MySQL时我们都知道索引对于一个SQL的优化很重要,而EXPLAIN关键字在分析是否正确以及高效的增加了索引时起到关键性的作用. 这篇文章显示了如何调用“EXPLAIN”来获取关于查询执行计划的 ...
- EXPLAIN 查看 SQL 执行计划
EXPLAIN 查看 SQL 执行计划.分析索引的效率: id:id 列数字越大越先执行: 如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. ...
- 转载:MySQL EXPLAIN 命令详解学习
转载自:https://blog.csdn.net/mchdba/article/details/9190771 MySQL EXPLAIN 命令详解 MySQL的EXPLAIN命令用于SQL语句的查 ...
- MySQL EXPLAIN 命令详解
MySQL EXPLAIN 命令详解 MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提 ...
- 第九课——MySQL优化之索引和执行计划
一.创建索引需要关注什么? 1.关注基数列唯一键的数量: 比如性别,该列只有男女之分,所以性别列基数是2: 2.关注选择性列唯一键与行数的比值,这个比值范围在0~1之前,值越小越好: 其实,选择性列唯 ...
- mysql之优化器、执行计划、简单优化
mysql之优化器.执行计划.简单优化 2018-12-12 15:11 烟雨楼人 阅读(794) 评论(0) 编辑 收藏 引用连接: https://blog.csdn.net/DrDanger/a ...
- 查看Oracle执行计划的几种方法
查看Oracle执行计划的几种方法 一.通过PL/SQL Dev工具 1.直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果.其中,Cos ...
随机推荐
- liunx_second_day
liunx-基本权限 1.文件和目录权限的区别 A.文件的权限:所有者,所属组,其他人 rwx,读,写,执行,没有权限就是- 第一组rwx:文件所有者的权限 第二组rwx:文件所属组的权限 第三组rw ...
- navicat连接mysql出现2059错误
最近在学习django的时候需要用到数据库,于是便下载了navicat准备和mysql配套使用,但是在连接的时候确出现了如下问题: 网上查询过后,发现这个错误出现的原因是在mysql8之前的版本中加密 ...
- Delphi XE7试用记录2
Delphi XE7试用记录2 万一博客中介绍了不少Delphi7以后的新功能测试,想跟着测试一下.每次测试建立一个工程,在窗体上放几个按钮,测试几个相关的功能,这样虽然简单明了,但日后查阅起来不方便 ...
- redis设置远程通过密码进行连接
个人配置:服务器+本地鸡+win 文件概况.↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 首先修改第一个redis.windows.conf 56行左右,将bind 127.0.0.1注释掉(行前面加上# ...
- background-attachment属性
通过对background-attachment属性的学习,辨析每个属性值之间的区别. 1.fixed与scroll的区别 background-attachment:fixed;当滚动页面滚动条时背 ...
- 在注册表中查看Windows10系统激活密钥的方法
1 2 3 4 5 6 7 分步阅读 百度经验:jingyan.baidu.com 激活Windows10系统(非自己使用激活密钥激活的系统)以后,我们不一定清楚激活密钥是什么.如果想查看自己电脑 ...
- es6的几种写法
语法:1.只有一个参数,可以不用写小括号: var single = a => a; //相当于var single = function(a){return a;}console.log(si ...
- JVM之垃圾收集器与内存分配回收策略(二)
上一篇JVM垃圾收集器与内存分配策略(一),下面是jdk1.7版本的垃圾收集器之间的关系,其中连线两端的两种垃圾收集器可以进行搭配使用,下面来总结一下这些收集器的一些特点以及关系. 一.Serial收 ...
- 64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)
上一节的MySQL的配置安装里,并没有用到配置文件my.ini.那在MYSQL8.0.13如何解决密码重置问题呢.我去网上搜了好多的资料都是改配置文件my.ini的,后来终于找到了一条命令:操作步骤如 ...
- Java工程师必备
Java工程师必备 JAVA基础扎实,熟悉JVM,熟悉网络.多线程.分布式编程及性能调优 精通Java EE相关技术 熟练运用Spring/SpringBoot/MyBatis等基础框架 熟悉分布式系 ...