看懂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优化点,以参数为准的主要内容,如果未能解决你的问题,请参考以下文章