继上一篇博客《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学习笔记的更多相关文章

  1. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  2. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

  6. MYSQL数据库学习笔记1

      MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 ...

  7. Mysql事务学习笔记

    Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...

  8. 尚硅谷MySQL高级学习笔记

    目录 数据库MySQL学习笔记高级篇 写在前面 1. mysql的架构介绍 mysql简介 mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ...

  9. MySQL存储过程学习笔记

    MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...

随机推荐

  1. Spring IoC源码解析之invokeBeanFactoryPostProcessors

    一.Bean工厂的后置处理器 Bean工厂的后置处理器:BeanFactoryPostProcessor(触发时机:bean定义注册之后bean实例化之前)和BeanDefinitionRegistr ...

  2. java并发编程(二十)----(JUC集合)CopyOnWriteArrayList介绍

    这一节开始我们正式来介绍JUC集合类.我们按照List.Set.Map.Queue的顺序来进行介绍.这一节我们来看一下CopyOnWriteArrayList. CopyOnWriteArrayLis ...

  3. windows下通过idea连接hadoop和spark集群

    ###windows下链接hadoop集群 1.假如在linux机器上已经搭建好hadoop集群 2.在windows上把hadoop的压缩包解压到一个没有空格的目录下,比如是D盘根目录 3.配置环境 ...

  4. ArrayList用法整理

    System.Collections.ArrayList类是一个特殊的数组.通过添加和删除元素,就可以动态改变数组的长度. 一.优点 1.支持自动改变大小的功能 2.可以灵活的插入元素 3.可以灵活的 ...

  5. 【JVM从小白学成大佬】2.Java虚拟机运行时数据区

    目录 1.运行时数据区介绍 2.堆(Heap) 是否可能有两个对象共用一段内存的事故? 3.方法区(Method Area) 4.程序计数器(Program Counter Register) 5.虚 ...

  6. ES解决bootstrap checks failed, memory locking requested for elasticsearch process but memory is not locked问题

    问题描述: ERROR: [1] bootstrap checks failed[1]: memory locking requested for elasticsearch process but ...

  7. Unity进阶之ET网络游戏开发框架 08-深入登录成功消息

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  8. Appium+Python+Genymotion ------环境配置

    前言 之前总是在找方向,也研究了很多的工具,终于找到了适合自己的一套,打算把学习的过程做一个记录,给自己加深印象,也希望能给其他人一些帮助. 一.工具准备 1.Appium  //  http://a ...

  9. 【CSS】Houdini, CSS的成人礼

    前情提要 CSS:老板,你看ES9,ES10都出来了,您看我的事情什么时候... W3C: 这不是正在走着流程嘛!小C你不要心急! W3C:(语重心长)你看啊,我们先(1)提个开发提案章程, 然后再批 ...

  10. 你真的了解setState()吗?

    React 中 setState()详细解读 对于 setState() 相信伙伴们都用过,它是 React 官方推荐用来更新组件 state 的 API,但是对于 setState() 你真的了解吗 ...