Explain

作者: 特仑苏纯牛乳 | 来源:发表于2019-12-23 21:50 被阅读0次

15.看懂explain

EXTRA:
Using index condition 使用索引作为条件,有回表操作
Using where; Using index 表示索引覆盖

========================================================
20191223更新:
认为explain时,sql语句不会执行这是一个常见的错误。事实上,如果查询FROM子句中包含子查询,那么mysql实际上会执行子查询,将其放在一个临时表中,然后完成外层查询优化。这意味着如果语句包含开销较大的子查询或使用临时表算法的视图,实际上会给服务器带来大量的工作。
mysql 5.6 以后允许explain 非select 查询。


图片.png

type:访问类型:(性能最差到最好排序)

  1. all:全表扫描
  2. index:这个跟全表扫描一样,只是mysql扫描表时按照索引次序进行,而不是行。它的主要优点是避免了排序;最大的缺点是要承担按照索引次序读取整个表的开销。如果在EXtra列中看到 using index 说明mysql正在使用覆盖索引,他只扫描索引的数据,而不是按索引次序的每一行。开销要小的多。
  3. range:范围扫描即,有限制的索引扫描
  4. ref:这是一种索引访问(也叫索引查找),返回匹配某个单值得行(指的是非唯一索引,或者唯一索引的非唯一性前缀 )ref_or_null 包含null查找的变体
  5. eq_ref:索引查找,且最多返回一条符合条件的记录。主键或者唯一索引查找
  6. const,system MySql能对查询的某部分进行优化并将其转换成一个常量时,会使用这个访问类型
  7. NULL 表示MySql能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引。

possible_keys列 :
用来展示查询可以使用那些索引

key列 :
显示MySQL决定使用哪个索引来优化对该表的访问

key_len列 :
使用key列索引的字节长度

ref列 :
记录之前key列索引中查找值所使用的列或常量

rows 列:
MySQL预估为了找到所需要的行,需要读取的行数。

filtered列:
针对表中符合条件的记录数的百分比做一个悲观的估算。

Extra列:
using index、
using where 意味着mysql服务器将在存储引擎检索后再进行过滤 ,意味着无法直接通过索引查找来查询到符合条件的数据
Range check for Each record 意味着没有用好索引,新的索引将在联接的每一行上重新估算

相关文章

网友评论

      本文标题:Explain

      本文链接:https://www.haomeiwen.com/subject/dblznctx.html