MySQL Explain学习笔记
继上一篇博客《MySQL的索引知识学习笔记》之后,我再记录一篇MySQL执行计划方面的博客,本博客是我在学习尚硅谷的学习教程后,做的笔记,当然我不是为了所谓宣传,仅仅是学习记录的笔记。本来可以不分享出来,不过,分享出来的笔记不仅可以给网上的学习者参考学习,同时写在csdn比较方便,可以支持图片上传,也方便自己以后查找复习,本博客CSDN版:链接
附录:我创建的数据库方面的专栏
一、执行计划概念
执行计划(Explain):explain显示了mysql如何使用索引来处理select语句以及连接表,使用Explain关键字可以模拟MySQL优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的。所以执行计划常用于SQL调优
二、Explain用法
Explain的用法:
- Explain + SQL语句
mysql> explain select * from sys_user;
mysql> use jeeplatform;
Database changed
mysql> explain select * from sys_user;
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | r
ows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
| 1 | SIMPLE | sys_user | ALL | NULL | NULL | NULL | NULL |
4 | |
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
1 row in set (0.00 sec)
mysql>
Explain的主要属性有id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,如何对这些属性进行比较详细的介绍
三、Explain属性介绍
执行计划(Explain)包括如下属性:
比较重要的属性有id、type、key、rows、Extra
3.1 id属性
id属性其实就是显示了SQL的执行顺序,下面分类解释
- id相同的情况
id相同的情况,执行顺序由上到下
本例子来自尚硅谷教程介绍,从执行计划可以看出就是t1>t3>t2,因为SQL有t1.other_column=''
的条件,所以先从t1开始执行,然后是t3,接着是t2
- id不同的情况
id不同的情况,根据id优先级来看,优先级越高越先执行
- id相同不同同时存在
这种是比较特殊的情况,不过还是按照优化先看,然后id相同的情况,还是按照从上到下的情况看
3.2 select_type属性
select_type就是查询的类型,用来区别普通查询、联合查询(union)、子查询等复杂查询,属性分为:
1、Simple
简单select查询,查询中不包括子查询、联合查询等2、PRIMARY
PRIMARY可以理解为主查询,当然是在包括子查询等情况下面,最外面的查询被称之为PRIMARY查询3、SUBQUERY
SUBQUERY就是子查询,一般用于select后面或者where条件后面4、DERIVED
DERIVED是衍生查询,一般用于from后面查询返回一个衍生表
5、UNION
UNION是联合查询,UNION或者UNION ALL关键字后面的查询表查询都被标记为联合查询
6、UNION RESULT
union result就是从union获取的查询结果
3.3 table属性
table属性,很显然这个属性就是显示查询数据是关于哪张表的
3.4 type属性
type属性表示MySQL找到数据行采取的方式,也称之为访问方式,显示了查询使用了何种类型
访问类型排序,从最好到最差的依次是(常用的):
system>const>eq_ref>ref>range>index>All
来自尚硅谷老师的归纳:
然后介绍一下这些级别
- ststem
表只有一条记录的情况,显示type为system,这种一般在系统表才会出现,是const的一种特例 - const
const常量,一般用于where条件后面,用于比较主键索引或者唯一索引,索引一次就可以找到一条记录,一般返回一个常量 - eq_ref
唯一性索引扫描,一般是主键Primary key或者唯一索引(union index),只返回一条记录与之匹配 - ref
非唯一性索引扫描,也是一种索引访问,不过符合的记录有多条 - range
索引返回扫描,一般来说在where条件出现了between或者<、>、in等符合或者关键字就是索引访问扫描,不过建了组合索引,有些情况是会导致索引失效的 - index
index也就是索引全扫描(full index scan),index和all的区别是:index扫描所有索引,all扫描所有数据,在mysql中,索引文件是比文件小,所以index扫描性能是比all好的 - All
all也是全表扫描,不建索引的情况,经常出现全表扫描(full table scan)
备注:要保证sql查询,一般要达到range,或者ref级别
3.5 possible_keys属性
用于显示理论上扫描可能用到的索引
3.6 key属性
用于显示实践上用到的索引,返回null表示没用到索引
3.7 key_len属性
表示索引使用的字节数,key_len显示的是索引字段最大的可能长度,并非实际使用的长度
3.8 ref属性
ref属性用于显示哪些常用或者列被用于查找索引,前提条件是走索引的
3.9 rows属性
rows数据是根据统计信息及索引选用情况,大致估算出的记录数
3.10 Extra属性
Extra可以理解为拓展或者额外的属性,包含了不在其它属性的信息,但是十分重要的额外信息,常用于分析定位性能问题,比较重要的属性有Using filesort、using temporary、using index
- 1、Using filesort
Extra信息显示这个信息说明无法利用索引完成排序order by,而选择了文件排序,这种情况是比较耗性能的,所以要看看索引失效的原因
如图来自尚硅谷视频的例子,这里就出现了Extra信息为using filesort,原因是where条件里用了col1,order by后面只用了col3,而复合索引是3个列都建的,所以导致不能用到索引排序,用了文件排序代替,解决方法是在order by加上col2
备注:索引的两大作用:排序和查询
2、using temporary
出现这个信息表示,使用了临时表保存中间结果,出现原因是在对查询结果排序时使用了临时表,常见与order by和group by一起用的情况
上面例子,就是using temporary的情况,在group by后面加上col2列,使索引能用得上3、Using index
出现using index说明出现覆盖索引(Covering index),是效率不错的!如果using where也一起出现,说明索引被用来查询,只有一个说明只用来读取数据
覆盖索引(Covering index),一说索引覆盖,意思是查询时,数据只要从索引获取就可以(从叶子节点获取),不需要读取数据行
注意:查询时,要使用索引覆盖,就要select的列表只取需要的列就可以,不可以select *
,如果将所有的字段一起做索引会导致索引文件过大,影响查询性能
- Using where
表示使用了where过滤条件 - Using join buffer
表示使用了连接缓存,也就是内外连接 - Impossible where
where子句的查询结果总是false,不能用来获取任何元组
- Select table optimized away
- Distinct
使用了distinct操作,在查到对一条记录后,就不查找相同的记录
四、案例学习
- 复杂点的案例
来自视频教程的案例
尚硅谷教师的归纳
MySQL Explain学习笔记的更多相关文章
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- MYSQL数据库学习笔记1
MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 ...
- Mysql事务学习笔记
Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...
- 尚硅谷MySQL高级学习笔记
目录 数据库MySQL学习笔记高级篇 写在前面 1. mysql的架构介绍 mysql简介 mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ...
- MySQL存储过程学习笔记
MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...
随机推荐
- Go中的并发编程和goroutine
并发编程对于任何语言来说都不是一件简单的事情.Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程. 1. 并行和并发 ...
- Redis的分布式和主备配置调研
目前Redis实现集群的方法主要是采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的. 对于一致性哈稀分片的算法,Jedis-2.0.0已经提供 ...
- 搭建Springboot网站有感
最近心血来潮,搭建了个人网站,一方面想学习下新的知识,另一方面也想有个作品,在这分享下自己的体会,先不说知识点. 建站容易吗,因人而异,而我在完成这个最最简单的工作时起码经历了3个阶段不同的心理变化, ...
- (二十七)c#Winform自定义控件-多输入窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- centos7单机安装kafka,进行生产者消费者测试
[转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11364852.html 作者:jstarseven 码字挺辛苦的..... 一.k ...
- 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议
Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...
- Kubernetes容器云平台建设实践
[51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...
- NFS Debian 服务器,CentOS 客户端
0x00 事件 最近买了一台 500G 储存的 VPS,但是与国内的连接.下载速度都比较差,于是想了个「曲线救国」的方式. 另外有一台 GIA 与 VPS-500G 通信比较理想,同时 GIA 与国内 ...
- warpAffine仿射变换
仿射变换,其实就是不同的坐标系的相互转换,用于图像的平移和旋转. 首先看一下官方的api描述. https://docs.opencv.org/2.4/modules/imgproc/doc/geom ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...