1.Explain介绍

在日常工作中, 我们会有时会开慢查询去记录一些执行时间比较久的SQL语句, 找出这些SQL语句后我们常常会用explain这个命令来查看一个这些SQL语句的执行计划, 查看该SQL语句有没有使用上了索引, 有没有做全表扫描等, 进而排查出执行慢的原因. 目前使用explain可以对select 、update 、insert 、replace 、delete进行分析.

通过explain命令,我们可以深入了解到MySQL的基于开销的优化器,还可以获得很多被优化器考虑到的访问策略的细节以及运行sql语句时哪种策略预计会被优化器采用。

explain的使用十分简单,通过在查询语句前面加一个explain关键字即可。

1.5.综合

整合了一些explain的介绍, 可以查询字段的一些示例等:

  1. https://www.manongdao.com/article-2417638.html
  2. https://www.jb51.net/article/126107.htm
  3. https://segmentfault.com/a/1190000021458117?utm_source=tag-newest
  4. https://zhuanlan.zhihu.com/p/149807046
  5. https://blog.csdn.net/fsdfkjai/article/details/121770629

2.参数说明

explain 命令一共返回12列信息, 如下:

id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra

2.1.参数概要描述

  1. id: 选择标识符
  2. select_type: 表示查询的类型
  3. table: 输出结果集的表
  4. partitions: 匹配的分区
  5. type:表示表的连接类型
  6. possible_keys:表示查询时,可能使用的索引
  7. key:表示实际使用的索引
  8. key_len:索引字段的长度
  9. ref:列与索引的比较
  10. rows: 扫描出的行数(估算的行数)
  11. filtered:按表条件过滤的行百分比
  12. Extra:执行情况的描述和说明

2.2.参数详细说明

①id列

每个select语句都会自动分配的一个唯一标识符。

如果explain的结果包括多个id值:

  • id相同,执行顺序从上到下
  • id不同,如果是子查询,id号会自增,id越大,优先级越高

总结:id的值表示select子句或表的执行顺序,id相同,执行顺序从上到下,id不同,值越大的执行优先级越高。

②select_type列

查询的类型,主要用于区别普通查询、联合查询、子查询等复杂的查询。其值主要有六个:

  1. SIMPLE: 表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple
  2. PRIMARY: 一个需要使用union的操作或者含有子查询的select,位于最外层的查询的select_type即为primary
  3. SUBQUERY: 在select或where列表中包含了子查询,就为被标记为SUBQUERY
  4. DERIVED: 用来表示包含在FROM子句的子查询中的SELECT,MySQL会递归执行并将结果放到一个临时表中。MySQL内部将其称为是Derived table(派生表),因为该临时表是从子查询派生出来的 (备注: MySQL5.7+进行优化了,增加了derived_merge(派生合并),默认开启,可加快查询效率)
  5. UNION: 如果第二个SELECT 出现在UNION之后,则被标记为UNION;如果UNION包含在FROM子句的子查询中,则外层SELECT 将被标记为DERIVED
  6. UNION RESULT: 从UNION表获取结果的select

③table列

表示当前这一行正在访问哪张表,如果SQL定义了别名,则展示表的别名

④partitions列

当前查询匹配记录的分区。对于未分区的表,返回null

⑤type列

连接类型,有如下几种取值, 性能从好到坏排序 如下:

  1. NULL: MySQL能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引
  2. system:: 表只有一条记录(等于系统表),这是const类型的特例,平时业务中不会出现。
  3. const: 通过索引一次查到数据,该类型主要用于比较primary key 或者unique 索引,因为只匹配一行数据,所以很快;如果将主键置于WHERE语句后面,Mysql就能将该查询转换为一个常量。
  4. eq_ref: 唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或者唯一索引扫描(连接字段为主键或者唯一索引,此类型通常出现于多表的join查询,表示对于前表的每一个结果,都对应后表的唯一一条结果。并且查询的比较是=操作,查询效率比较高。)
  5. ref: 当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。非唯一性索引扫描,返回匹配某个单独值的所有行, 本质上也是一种索引访问,返回所有匹配某个单独值的行, 然而可能会找到多个符合条件的行,应该属于查找和扫描的混合体
  6. fulltext: 全文检索索引
  7. ref_or_null: 该类型类似于ref,但是MySQL会额外搜索哪些行包含了NULL。这种类型常见于解析子查询
  8. index_merge: 此类型表示使用了索引合并优化,表示一个查询里面用到了多个索引(表示查询使用了两个或者以上的索引数量,常见于and或者or查询匹配上了多个不同索引的字段)
  9. unique_subquery: 该类型和eq_ref类似,但是使用了IN查询,且子查询是主键或者唯一索引; 例如:value IN (SELECT primary_key FROM single_table WHERE some_expr)
  10. index_subquery : 和unique_subquery类似,只是子查询使用的是非唯一索引
  11. range: 范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描, key列显示使用了哪个索引。比较常见的范围扫描是带有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符; 这种索引的范围扫描比全表扫描要好,因为索引的开始点和结束点都固定,不用扫描全索引。
  12. index: Full index Scan,Index与All区别:index只遍历索引树,通常比All快, 因为索引文件通常比数据文件小,也就是虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘读的。
  13. ALL: Full Table Scan,将遍历全表以找到匹配行, 也就是全表扫描,性能最差。

⑥possible_keys列

显示可能应用在这张表的索引,一个或者多个。
查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用。
这一列的数据是在优化过程的早期创建的,因此有些索引可能对于后续优化过程是没用的。

⑦key列

实际使用到的索引,如果为NULL,则没有使用索引
查询中若使用了覆盖索引(select 后的 字段与我们建立索引的字段个数一致),则该索引仅出现在key列表

⑧key_len列

表示索引中使用的字节数,可通过该列计算查询中使用的索引长度。
在不损失精确性的情况下,长度越短越好。
key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出来的。

⑨ref列

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值, 如果ref是一个函数,则使用的值是函数的结果。要想查看是哪个函数,可在EXPLAIN语句之后紧跟一个SHOW WARNING语句。

⑩rows列

MySQL估算会扫描的行数,数值越小越好。也就是根据表统计信息及索引选用的情况,大致估算找到所需记录需要读取的行数。

①①filtered列

表示符合查询条件的数据百分比,最大100。用rows × filtered可获得和下一张表连接的行数。例如rows = 1000,filtered = 50%,则和下一张表连接的行数是500。
备注: 在MySQL 5.7之前,想要显示此字段需使用explain extended命令;MySQL.5.7及更高版本,explain默认就会展示filtered

①②extra列

包含不适合在其它列中显示但十分重要的额外信息, 常见的重要值如下:

  1. Using filesort(文件排序): mysql无法按照表内既定的索引顺序进行读取。也就是说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取, MySQL中无法利用索引完成的排序操作称为“文件排序”.
  2. Using temporary: 使用了临时表保存中间结果,MySQL在对结果排序时使用临时表,常见于排序order by 和分组查询group by。
  3. Using index: 表示相应的select 操作使用了覆盖索引,避免访问了表的数据行,效率不错; 如果同时出现using where,表明索引被用来执行索引键值的查找; 如果没有同时出现using where,表明索引用来读取数据而非执行查找动作
  4. Using where: 使用了where条件
  5. Using join buffer: 使用了连接缓存
  6. impossible where: where子句的值总是false,不能用来获取任何数据行
  7. distinct: 一旦mysql找到了与行相联合匹配的行,就不再搜索了
  8. Select tables optimized away: SELECT操作已经优化到不能再优化了(MySQL根本没有遍历表或索引就返回数据了)

MySQL-explain详解说明的更多相关文章

  1. Mysql Explain 详解

    Mysql Explain 详解[强烈推荐] Mysql Explain 详解一.语法explain < table_name >例如: explain select * from t3 ...

  2. (转)mysql explain详解

    原文:http://www.cnblogs.com/xuanzhi201111/p/4175635.html http://yutonger.com/18.html http://www.jiansh ...

  3. MySQL性能优化(四)-- MySQL explain详解

    前言 MySQL中的explain命令显示了mysql如何使用索引来处理select语句以及连接表.explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句. 一.格式 explain + ...

  4. Mysql Explain 详解(转)

    原文:http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html 一.语法 explain < table_name > ...

  5. mysql explain详解

    对于经常使用mysql的兄弟们,对explain一定不会陌生.当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联合和以什么次序的信息.借助于 ...

  6. [转]MySQL Explain详解

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  7. 一篇详细的 Mysql Explain 详解

    一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +—-+— ...

  8. MySQL Explain详解(转)

    explain SELECT a.* FROM test a,(select id from test where level_id <=4 order by aa_id limit 24300 ...

  9. MySQL Explain详解 查看mysql语句详情

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  10. MYSQL explain详解[转载]

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!! 先解析 ...

随机推荐

  1. shm

    进程间共享内存访问及读写 目录 进程间共享内存访问及读写 1. 进程间共享内存相关linux_C函数 2. 进程间共享内存基本流程 3. demo code 1. 进程间共享内存相关linux_C函数 ...

  2. CCPC2021 广州 K. Magus Night

    CCPC2021 广州 K. Magus Night 题意 给定整数区间 \([1,m]\) ,从中可重复的选择 \(n\) 个数,形成一个数列 \(\{a_n\}\) .问:所有满足 \(\gcd( ...

  3. 处理Android的物理后退按钮

    在文章.聊天.联系.相册四个页面时,用户点击Android 物理键返回,需要直接退出程序.我这里处理很简单,直接使用react-navigation的属性backbehavior就很快的解决了. &l ...

  4. python 链表推导式x for xx in yy

    一.(x for xx in yy )当x为固定参数 如: n = 10 # 生成n个0 matrix = [0 for i in range(n)]# 这里面0代表返回值,后面的for循环就是返回的 ...

  5. windows10本地联调zk环境报异常SASL config status: Will not attempt to authenticate using SASL (unknown error)

    感谢原文:https://blog.csdn.net/qq_43639296/article/details/123282280 SASL config status: Will not attemp ...

  6. Java06 面向对象

    一 什么是面向对象 面向对象编程(Object-Oriented Programming,OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象组织(封装)数据. 三大特性: 封装 继承 多态 ...

  7. jenkins+stf+airtest实现移动端自动化测试平台

    背景: 公司android测试机比较多没有统一的管理: app自动化测试时获取设备的状态比较麻烦,通过STF可以轻松获取: 自动化异常场景时.可远程操控设备: 需要随时了解设备情况: 装逼 前提: 已 ...

  8. 小程序Excel导入导出数据库功能

    https://blog.csdn.net/yhcad/article/details/116204444 unit Umain;interfaceuses  Winapi.Windows, Wina ...

  9. OSPF配置常用命令知识总结

    OSPF配置常用命令知识总结 1.display ospf abr-asbr 命令用来显示OSPF的区域边界路由器和自治系统边界路由器信息. [R3]dis ospf abr-asbr OSPF Pr ...

  10. jeecgboot <j-popup

    <a-col :span="24"> <a-form-item label=" 规格" :labelCol="labelCol&qu ...