MySQL中explain使用详解

一.explain

explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和优化查询语句。

二.主要包含的列以及列的含义
1. id

select识别符,指第几个select。
id值如果相同,可以认为是一组,从上往下执行;在所有组中,id值越大,优先级越高,越先执行。

2.select_type

指select类型,可以包含以下几种:

  • SIMPLE: 简单select,不使用UNION或者子查询
  • PRIMARY: 指最外面的select
  • UNION: UNION中的第二个或者后面的select语句
  • DEPENDENT UNION: UNION中的第二个或者后面的select语句,取决于外面的查询
  • UNION RESULT: UNION的结果
  • SUBQUERY: 子查询中的第一个select
  • DEPENDENT SUBQUERY: 子查询中的第一个select,取决于外面的查询
  • DERIVED: 导出表的select(from子句的子查询)
3. table

输出的行所引用的表

4.type

连接类型。下面是 最好==>最坏的连接类型

  • system:表仅有一行,这是const连接类型的一个特例。
  • const:表最多只有一个匹配行,它将在查询开始的时候被读取。(如将主键置于where列 表中,MySQL就能将该查询转换为一个常量)
  • eq_ref:类似于ref,区别就在于使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique key作为关联条件。
  • ref:使用非唯一索引或者唯一索引的前缀扫描,返回匹配某个单独值得记录行。
  • range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。比较常见的range类型的是带有between或者where子句里带有<,>查询。当MySQL使用索引去查找一系列值时,例如IN()和OR列表,也会显示range。
  • index:Full Index Scan,index和all区别为index类型只遍历索引树。
  • all:Full Table Scan,MySQL将遍历全表以找到匹配的行。
5.possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上如果存在索引,则该索引将被列出,但不一定被查询使用。

6.key

显示MySQL在实际查询中使用的索引,如果没有使用索引,显示为null

7.key_len

显示的值为MySQL在实际查询中使用的索引字段的最大长度,并非实际使用的长度。

8.ref

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

9.rows

显示MySQL认为它执行查询时必须检查的行数,多行之间的数据相乘可以估算要处理的行数。

10.Extra

该列包含MySQL解决查询的详细信息

  • using index:该值表示相应的select语句使用了覆盖索引。
    覆盖索引:MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件。
  • using where:在查找使用索引的情况下,需要回表去查询所需的数据。
  • using temporary:表示MySQL需要使用临时表来存储结果集,常用于排序和分组查询。
  • using filesort:无法利用索引完成的操作称为“文件排序”
  • using join buffer:该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,可能需要根据查询的具体情况添加索引来改进性能。
  • impossible where:该值说明了where子句会导致没有符合条件的行。
  • select tables optimized away:该值说明了仅通过索引,优化器可能仅从聚合函数结果中返回一行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值