看懂Explain,找准SQL优化点,以参数为准

Posted 泡^泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看懂Explain,找准SQL优化点,以参数为准相关的知识,希望对你有一定的参考价值。

id

  • id值不同的时候,先查询id值大的(从大到小)。
  • id值相同的时候,表的查询顺序是从上往下顺序执行。
  • 即有相同也有不同,id不同的先从大到小,id相同的从上到下。

select type查询类型

SIMPLE

简单查询,不包含子查询,不包含关联查询union。

PRIMARY

子查询SQL语句中的主查询,也就是最外层的那层查询。

SUBQUERY

子查询中所有的内层查询都是SUBQUERY类型的。

DERIVED

衍生查询,表示在得到最终查询结果之前会用到临时表。

对于关联查询,先执行后边的table(UNION),再执行左边的table,类型是DERIVED。

UNION

用到了UNION查询。

UNION RESULT

主要是显示哪些表之间存在UNION查询。<union2,3>代表id=2和id=3的查询存在union。

type连接类型

所有的连接类型中,上面的最好,越往下越差。
在常用的链接类型中:system > const > eq_ref > ref > range > index > all (剩余的没有列举完),除了all以外,都可以用到索引。

const

主键索引或者唯一索引,只能查到一条数据的SQL。

system

system是const的一种特例,只有一行满足条件,对于MyISAM、Memory的表,只查询到一条记录,也是system。(比如:mysql.proxies_priv(系统库表)8.0的数据库版本都改成了InnoDB存储引擎了)

eq_ref

通常出现在多表的join查询,被驱动表通过唯一性索引(UNION或PRIMARY KEY)进行访问,此时被驱动表的访问方式就是 eq_ref。
eq_ref是除了const之外最好的访问类型。

ref

查询用到了非唯一性索引,或者关联操作只使用了索引的最左前缀。

range

索引范围扫描。如果where后面是 between and 或 < 或 > 或 >= 或 <= 或 in 这些,type类型就是 range。不走索引一定是全表扫描 (ALL),索引先加上普通索引。

IN 查询也是range

index

Full Index Scan,查询全局索引中的数据。(比不走索引要快)。

all

没有使用到索引,type就是ALL。代表全表扫描。

NULL

不用访问表或者索引就能得到结果。

possible_key


可能使用到的索引。

key


实际使用到的索引。

key_len

索引的长度(使用的字节数)。跟索引字段的类型、长度有关。

rows

mysql认为扫描多少行才能返回请求的数据,是一个预估值。一般来说行数越少越好。

filtered

这个字段表示存储引擎返回的数据在 server 层过滤后,剩下多少满足查询的记录数量的比例,它是一个百分比。

ref

使用哪个列或者常数和索引一起从表中筛选数据。

Extra

执行计划给出的额外的信息说明。
1.using index (覆盖索引)
2.using where 返回的数据需要在 server层进行过滤,和索引无关。(where过滤)
3.using index condition (索引条件下推)
4.using filesort 不能使用索引来排序,用到了额外的排序。需要优化。
5.using temporary 用到了临时表。(比如: distinct 非索引列 / group by 非索引列 / 使用 join 的时候 ,group by 任意列)

以上是关于看懂Explain,找准SQL优化点,以参数为准的主要内容,如果未能解决你的问题,请参考以下文章

MySQL执行计划Explain参数详解

分析oracle的执行计划(explain plan)并对对sql进行优化实践

带你看懂MySQL执行计划

oracle执行计划(Explain Plan for

oracle执行计划(Explain Plan for

MySQL优化必备之执行计划explain,索引基本知识,索引数据结构推演