参考:《高性能mysql》附录D EXPLAIN

MySql将Select查询分为简单和复杂类型,复杂类型分为3大类:简单子查询,所谓的派生表(在派生表的子查询),以及UNION查询。

列与其介绍

id

  该列包含一个编号,标识SELECT所属的行。

select_type

  该列显示了对应行是简单还是复杂的select(如果是后者,那么是三种复杂类型中哪一种)。

  simple:查询不包括子查询和UNION。

  primary:如果查询有任何复杂的子部分,则最外层标记为primary。

  subquery:包含在select列表中的子查询中的select(换句话说,不在from子句中)标记为subquery。

derived:用来标识包含在from子句的子查询中的select,mysql会递归执行并将结果放到一个临时表中。服务器称其为派生表,因为该表是从子查询派生而来的。

  union:在union中的第二个和随后的select被标记为union。第一个select被标记就好像它以部分外查询来执行。

  union result:用来从union匿名临时表检查结果的select被标记为union result。

table

  显示了对应行正在访问那个表。在通常情况下,它就是那个表,或是该表的别名。

type

  访问类型---mysql决定如何查找表中的行。(从差到优)

  all:全表扫描,通常意味着Mysql必须扫描全表,从头到尾,去找到需要的行。(这里有个例外,在查询中使用了limit,或者在extra列中显示‘Using distinct/not exists’)。

  index:这个和全表扫描一样,只是mysql扫描表时按索引次序进行而不是行。它的主要优点是避免了排序;最大的缺点就是要承担按索引次序读取整个表的开销。这通常意着若是按照随机次序访问行,开销将会非常大。如果在extra列中看到‘using index’,说明MySql正在使用覆盖索引,它只扫描索引的数据,而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少得多。

  range:范围扫描就是一个有限制的索引扫描,它开始于索引的某一点,返回匹配这个值域的行。它比全索引好一些,因为它不用遍历全部索引。显而易见的范围扫描是带有between或在where子句里带有>的查询。

  ref:这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行。然而,它可能会找到多个符合条件的行,因此,它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生。把它叫做ref是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询钱一个表里的结果值。 ref-null是ref之上的一个变体,它意味着MySql必须在楚辞查找的结果里进行第二次查找以找出NULL条目。

  eq-ref:MySql知道最多只返回一条符合条件的记录。这种访问方法可以在MySql使用主键或者唯一性索引查找时看到,它会将它们与某个参考值作比较。MySQL对于这类访问类型的优化做的非常好,因为它知道无需估计匹配行的范围或在匹配行后再继续查找。

explain select tb_order.*,tb_user.username from tb_order INNER JOIN tb_user on tb_order.user_id = tb_user.id

结果:

  const,system:当MySql能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。举例来说,如果你将某一行的主键放入where子句里的方式来选取此行的主键,mysql就能把这个查询转化为一个常量。常用于primary key 和 unique 索引的查询。

null:这种访问方式意味着MySql能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引。例如,从一个索引列里选取最小值可以通过单独查找索引来完成,不需要再执行时访问表。

possible_keys

  这一列显示了查询可以使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的。这个列表是在优化过程的早期创建的,因此有些罗列出来的索引可能对于后续优化过程是没用的。

key

  这一列显示了MySql决定采用哪个索引来优化对该表的访问。如果该索引没有出现在possible_keys列中,那么MySql选用它是出于另外的原因---例如,它可能选择了一个覆盖索引,哪怕没有where 子句。

  possible_keys揭示了哪一个索引能有助与高效地行查找,而key显示的是优化采用哪一个索引可以最小化查询成本。

key_len

  该列显示了MySql在索引里使用的字节数。

ref

  显示使用哪个列或常数与key一起从表中选择行。

rows

  显示MySQL认为它执行查询时必须检查的行数。这个数字是内嵌循环关联计划里的循环数目。也就是说它不是MySql认为它最终要从表里读取出来的行数,而是MySql为了找到符合查询的每一点上标准的那些行而必须读取的行的平均数。

fitered

  显示的是针对表里符合某个条件(where子句或联接条件)的记录数的百分比所做的一个悲观估算。把rows列和这个百分比相乘,就能看到MySql估算它将和查询计划里前一个表关联的行数。

extra

  这一列包含的是不适合在其他列显示的额外信息。

  • Using index:使用覆盖索引,以避免访问表。
  • Using where:在存储引擎检索行后再进行过滤。许多where条件里涉及索引中的列,当MySql服务器读取索引时,就能被存储检验,因此不是有带Where子句的查询都会显示“Using Where”。
  • Using temporary:对查询结果排序时会使用一个临时表。
  • Using filesort:MySql会对结果使用过一个外部索引排序,而不是按索引次序从表里读取行。
  • range checked for each record (index map: N):这个值意味着没有好用的索引,新的索引讲再联接的每一行是上重新估算。N是显示在possible_keys列中索引的位图,并且是冗余的。

mysql explain中的列的更多相关文章

  1. mysql explain中的 “Select tables optimized away”

    mysql explain中的 “Select tables optimized away” http://blog.chinaunix.net/uid-10449864-id-2956845.htm ...

  2. CSV文件插入到mysql表中指定列

    参考资料: -CSV文件插入到mysql表中指定列

  3. mysql explain中key_len的作用

    mysql explain中key_len的作用key_len越小 索引效果越好 name的字段类型是varchar(20),字符编码是utf8,一个字符占用3个字节,那么key_len应该是 20* ...

  4. mysql explain中key_len值的说明

    在mysql 的explain的输出中,有个key_len的列,其数据是如何计算的呢? 在看到了淘宝的dba以前发布的博客后,我在mysql 5.6上操作一番,了解了一点. 环境准备 – 创建表. u ...

  5. 为什么rows这么大,在mysql explain中---写在去acumg听讲座的前一夜

    这周五下班前,发现了一个奇怪问题,大概是这个背景 一张表,结构为 Create Table: CREATE TABLE `out_table` ( `id` ) NOT NULL AUTO_INCRE ...

  6. mysql explain中的type列含义和extra列的含义

    很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是“访问类型”,更通俗一点就是: ...

  7. mysql explain 中key_len的计算

    今天丁原问我mysql执行计划中的key_len是怎么计算得到的,当时还没有注意,在高性能的那本书讲到过这个值的计算,但是自己看执行计划的时候一直都没有太在意这个值,更不用说深讨这个值的计算了: ke ...

  8. [MySQL] explain中的using where和using index

    1. 查看表中的所有索引 show index from modify_passwd_log;  有两个 一个是id的主键索引 , 一个是email_id的普通索引 2. using index表示 ...

  9. mysql explain中key_len的计算

    ken_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断是否所有的索引字段都被查询用到. key_len显示了条件检索子句需要的索引长度,但 ORDER B ...

随机推荐

  1. 爬虫获取网页数据,报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start by

    https://blog.csdn.net/hj_xy_0705/article/details/85011072

  2. Tomb Raider HihoCoder - 1829 (二进制枚举+暴力)(The 2018 ACM-ICPC Asia Beijing First Round Online Contest)

    Lara Croft, the fiercely independent daughter of a missing adventurer, must push herself beyond her ...

  3. 百度贴吧自动回帖的两种方式,使用requests(urllib2)和selenium两种方式回帖

    本文介绍,回复贴吧指定某楼层主的帖子的方法.在这里不介绍无限发主贴和无限回复主贴的方法,无限发主题帖会爆吧,引起别人的反感,并且很容易遭到吧主的封杀:无限回主题帖,会让整个帖子的每楼的回复充满了自己的 ...

  4. SSH加密传输

    数据传输安全的要满足的要求: (1)消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密) (2)消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息 ...

  5. JAVA笔记15-线程同步

    一.概念 1.多个线程之间访问同一资源,进行协调的过程是线程同步.例如两个人同时操作同一银行账户.解决方法:加锁 2.Java种引入对象互斥锁的概念,保证共享数据操作的完整性.每个对象都对应于一个可称 ...

  6. VUEX报错 [vuex] Do not mutate vuex store state outside mutation handlers

    数组 错误的写法:let listData= state.playList; // 数组深拷贝,VUEX就报错 正确的写法:let listDate= state.playList.slice(); ...

  7. 【leetcode】1228.Missing Number In Arithmetic Progression

    题目如下: 解题思路:题目很简单.先对数组排序,根据最大值和最小值即可求出公差,然后遍历数组,计算相邻元素的差,如果差不等于公差,即表示数字缺失. 代码如下: class Solution(objec ...

  8. 【leetcode】1213.Intersection of Three Sorted Arrays

    题目如下: Given three integer arrays arr1, arr2 and arr3 sorted in strictly increasing order, return a s ...

  9. node中controller的get和post方法获取参数

    1.get: const body = ctx.query; // get请求   2.post: const body = ctx.request.body; // post请求

  10. java+web+批量下载文件

    JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...