mysql工具explain的介绍

1.explain是什么?它能帮助我们做什么呢?

explain是mysql的解释工具,它反映了mysql底层是如何理解我们写的sql语句,并且如何执行。可以帮助我们获悉sql语句中表的加载顺序,数据读取操作的操作类型,表的哪些索引可能被使用,哪些索引被真正的使用,及表之间的引用关系(譬如连接查询时,到底以哪一张表为基准与其它表进行比对)等等。整理的表格如下:
在这里插入图片描述

2.怎么样看懂explain给出的信息?

博主的环境是mysql5.7,部署在centos7上。让我们先用explain做一下小的case观察一下:
在这里插入图片描述
我们现在观察表头就好,不需要看对应表头的值是多少,接下来我会解释。

  • id,可以告诉我们表的加载顺序
  • select_type:查询类别,可以初步分为简单查询,子查询,连接查询等等
  • table:那当然就是表的名字啦!
  • partitions:该列显示的为分区表命中的分区情况。非分区表该字段为空(null)。
  • type:sql底层实际访问数据的类别,由好到坏依次为system>const>eq_ref>ref>range>index>all
  • possible_keys:查询中可能用到的索引
  • key:查询中真正用到的索引。
  • key_len:代表索引的长度,以字节为单位。
  • ref:数据的寻找参考了哪一个字段
  • rows:显示MySQL认为它执行查询时必须检查的行数。估算出的行数值,不是精确值。行数越少越好.
  • Extra:额外的重要信息!
    接下来一一介绍哦。用到的表的信息如下:
    这里插入图片描述
    在这里插入图片描述
    其中表一的deptId字段参考表二的id字段

1.id的理解
在这里插入图片描述
在上述的连接查询中,表a和b的id一栏都是1,那就代表它们的加载优先级是相同的,并且实际的加载顺序是从上到下的,也就是说,b表先加载,a表后加载。

在这里插入图片描述
在上述的子查询中,a表的id是1,b表的id是2,那么代表b的加载先于a表,这也符合我们的认识,子查询中内层查询先于外层。

由此我们可以得出结论,id一栏表示表的加载顺序,当id相同时,加载顺序是从上到下的,不同时,id一栏的数字越大,那么加载越优先。

2.select_type的理解
代表sql语句查询类型,常见的有以下几种。
在这里插入图片描述

  • SIMPLE简单查询
  • PRIMARY主查询,是相对于SUBQUERY的概念,在子查询外围就是主查询。
  • SUBQUERY子查询,相信学过mysql基础的都知道子查询的含义。
  • DERIVED是衍生查询,代表查询过程出现了临时表。
  • UNION查询时使用了UNION关键字
  • UNION RESULT是UNION结果集的合并。
    看一个综合案例.
    在这里插入图片描述

3.table的理解
很简单,就是列出表的名字,取了别名是会用别名。

4.type的理解
**注意这是很重要的一环。**代表mysql底层对查询的优化程序。

  • system级别
    system表只有一行记录(等于系统表),是const类型的特例,平时不会出现。
    只会在MYISAM或者MEMORY引擎上用,这里我们用的是默认的INNODB引擎,不变演示,了解下概念就好.

  • const级别
    代表通过索引字段一次就找到了需要的记录。
    在这里插入图片描述
    由于我们明确的指出了需要找id为1的记录,并且id字段是主键。那么就代表了它是个索引字段,并且唯一。所以通过一次扫描就可以找到。

  • eq_ref
    表示唯一线性扫描,也是表中只有一条记录匹配,常见于主键或者唯一索引。很容易与const搞混。简单地说是const是直接按主键或唯一键读取,eq_ref用于联表查询的情况,按联表的主键或唯一键联合查询。更直接的区别是,eq_ref可以是唯一匹配,多条记录。
    看一个例子:
    在这里插入图片描述
    a表和b表的id字段都是唯一的,那就代表一旦匹配,那就直接可以停止搜索了。

  • ref的理解
    ref表示是非唯一性匹配,返回匹配某个单独值的所有行,本质上也是索引访问,可能找到多个符和条件的行。比如在一个银行系统中,找一个叫做王芳的人,而名字这个字段是建立了索引的。通过这个名字可以找到多条记录。
    临时建一个索引.
    在这里插入图片描述
    利用name字段作为条件查询。
    在这里插入图片描述

  • range的理解
    range是检索指定范围内的行,key列显示使用了哪一个索引,一般where后面的条件是一个范围内的信息是启用.。也就是搜索时用到了部分唯一索引值。
    在这里插入图片描述

  • index的理解
    在字段建立了索引的情况下,用到了所有的索引。
    在这里插入图片描述

5.possible_keys和key代表可能用到的索引和真正用到的索引。

6.key_len的理解
用到的索引字段的长度。以字节为单位。但是请注意,变长字段需要额外的2个字节,固定长度字段不需要额外的字节。而null都需要1个字节的额外空间,所以以前有个说法:索引字段最好不要为NULL,因为NULL让统计更加复杂,并且需要额外一个字节的存储空间。这个字段在后续还会使用。帮助我们理解索引失效的情况。

7.ref的理解
哪些列或常量被用来查找索引列的值。
const:代表常量值
在这里插入图片描述
连接查询时:
在这里插入图片描述
查找a表的索引的值用到了e.id字段。

8.rows的理解
代表了实际查询的行数。一个估算值,不精确。越少越好。

9.Extra的理解

  • using file sort:在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。出现这个问题可就大了,对性能的损耗十分严重。
    在这里插入图片描述
    - using temporary:有的爽了,天崩地裂。不仅没有用索引字段排序,而且在排序的过程中还创建了临时表,占用了额外的空间。出现这个情况时,要九死一生了。
    **- using index:**很好。代表我们的查询或排序是走了索引的。要涨工资了。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值