mysql explain简介

explain 介绍

  • 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈
    在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,但是不会执行这条sql语句

MySQL explain 语句及其详细输出信息介绍 官方文档https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

explain与show warnings联合使用
explain 语句会产生一条数据,下面会对数据列表的字段进行讲解,
在这里插入图片描述
show warnings语句 则会由mysql 优化器优化用户写的sql语句 (下篇文章中会写一条sql的执行过程)看下优化器优化后最终执行的sql。直接将SQL语句进行了常量的替换。

/* select#1 */ select '1' AS `id`,'a' AS `name`,'2017-12-22 15:27:18' AS `update_time` from `test`.`teacher` where true

explain中的列

  • id
    select 的序号,一个select 语句有一个id id越大的语句越先执行,id相同的值排在上面的先执行 id为null的最后执行。

  • select_type列
    select_type 顾名思义,查询的类型 那么select_type常用主要有以下几种类型

    • 1.simple:简单查询。简单查询不包含子查询和union查询

    • 2.primary:复杂查询中最外层的 select 例:
      在这里插入图片sswsw描述

    • 3.subquery:包含在 select 中的子查询(不在 from 后面)

    • 4.derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个验衍生表中,也称为派生表(derived的英文含义)注意:查询派生表时需要关闭派生表合并优化

      set session optimizer_switch='derived_merge=off'; 
      
    • 5.union: 在union all 后面的select
      在这里插入图片描述

  • table列

    • 这一列表示sql语句访问的表 如下图 ,derivedN 表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。当有 union 时,union result的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id
    • 当table列为NULL时代表mysql执行sql语句不需要查询表,例如min函数,直接在索引树就能处理。
      在这里插入图片描述
  • partitions
    表使用分区操作时,显示查询使用的分区

  • type列

    • 介绍:type表示sql语句访问数据的类型 例如:索引访问,全表扫描等,类似于一种sql优化程度,type类型主要有以下几种经常使用的类型 system >const>eq_ref>ref>>range>index>all 其中all为全表扫描 。
    • system和const的介绍:
      mysql的优化器能够将语句优化为常量查询,上面有实例。通常在使用主键索引或者常量值查找 比如 where id =‘’ 只有一条数据情况下为const ,system情况比较特殊,当表里只有一个元组匹配时为system (系统表)
      在这里插入图片描述
    • eq_ref :用于唯一索引,主键索引或联合索引在进行表连接时整个索引部分都被使用,并且最多返回只有一条符合条件的记录,不会存在于简单查询
      在这里插入图片描述
    • ref:相比 eq_ref,非唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个数据值进行比较,可能会找到多个符合条件的行 例
      在这里插入图片描述
    • range: 通常使用于范围查询 例如 between 、in()、>、<、>=、<= 例如
      在这里插入图片描述
    • index:通常为使用二级索引时触发,在使用二级索引 例如覆盖索引或唯一索引,不会从根节点出发,而是直接遍历叶子节点 使用二分查找等方法,这种方法不算太快但是比全表扫描的好
      在这里插入图片描述
    • all:全表扫描
  • possible_keys: mysql分析可能会使用的索引

  • key:实际使用到的索引

  • ken_len:索引使用的长度,拿联合索引举例,这里key_len是4 就只用到一个teacher_id 字段,该字段为int类型 为四个字节 长度计算规则参考文章
    在这里插入图片描述

  • ref: 这列是指在使用索引key列中,表查询用到的常量 如上图 teacher_id = ‘12’ 常见的类型有两种 1.const 上图所示 2.字段名称teacher.id

  • rows:rows是MySQL预估扫描或检测的行数不一定准确

  • filtered:参考这篇文章,本人不太懂

  • Extra列
    1.Using index:使用覆盖索引
    2.Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖
    3.Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围,进行了回表
    4.Using temporary:MySQL在执行sql时需要建立一张临时表进行数据处理,比如一个字段没有索引 又要对这个字段进行distinct 去重,就需要维护一张临时表,当然还有其他场景,比如排序,分组查询
    5.Using filesort:使用外部排序,不在索引排序,可能会使用内存排序或者磁盘排序,看数据的大小情况,文件排序又分为两种情况 分别为 单路排序和双路排序 大概介绍,下篇文章会详细介绍,内存中会维护一个sortbuffer 单路排序会将所有数据加载到buffer进行排序,而双路排序会将排序字段和主键加载到buffer排序完后需要再次取回其它需要的字段;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值