MySql- Explain

Explain语句可以查看SQL的执行情况,根据执行情况进行优化。

1. id

id查询的标识符,几个查询几个id。NULL表示引用其它行的结果。id越大执行优先级越高

2. select_type

  1. SIMPLE: 简单查询
  2. PRIMARY: 最外层查询
  3. UNION: 使用union时第二个查询和之后的查询的select_type会被标记为UNION
  4. UNION RESULT
    如果是union,最后对结果去除的操作的select_type会被标记为UNION RESULT
    如果是union all不存在id为NULL的额外一行,也就不存在select_type为UNION RESULT的行
  5. SUBQUERY
    子查询
  6. DERIVED
    派生, from里的select,并不一定有

3. table

访问哪一个表,从哪一个表里进行查询

4. partitions

当前查询匹配记录的分区,未分区的表返回null

5. type

连接类型,决定了sql的执行速度

  1. system:const的特例,

  2. const: 针对主键或唯一索引等值查询扫描,最多返回一行数据,

  3. eq_ref:
    唯一性索引扫描,对于每个索引键表中只有一条记录与之匹配
    当使用了索引的全部组成部分,并且索引是PRIMARY 或 UNIQUE NOT NULL时才会使用

  4. ref
    非唯一性索引扫描,返回匹配某个值的所有行,
    通过索引查找结果,但是有多个匹配行

  5. range
    范围查找,使用索引

  6. index
    扫描全部索引和ALL相比只从索引读取

  7. ALL全表扫描
    遍历全表

4. possible_keys,Key

possible_keys查询可能用到的索引,但不一定被使用
Key实际使用的索引
如果Key为Null,则没有使用索引
如果是索引覆盖即通过索引就查询到了相应的值,则possibile为Null,使用的索引在key中

5. key_len

索引使用的字节数,查询中使用的索引最大长度,长度越长精度越高效率越低,长度越短效率越高,但精度越低。是一个预估值

6.ref

where或join中与索引比较的参数,常见的有const(常量),func(函数)、字段名

7. rows, filtered

rows预估需要扫描的行数,越小越好
filtered:符合查询条件的数据百分比,最大为100,

8. Extra

额外信息

  1. using where
    使用了where但没使用索引,有时候使用了索引也使用了where也有,比如id的例子中,Primary的那个查询中使用了索引也有where。

  2. Using index索引覆盖

  3. Using filesort 使用外部排序,而不是按照表内的索引顺序读取, 可能需要优化

  4. using temporary
    使用了临时表

  5. using join buffer
    join时没有用到索引,使用了连接缓存

  6. using index condition
    使用索引下推,查询的列有非索引列,但先判断索引条件以减少磁盘io。
    实际使用的时lnam的索引但是fnam不再lname的索引中。


使用all_name索引,但是又查询了title列,title列不在索引里。

posted @ 2022-09-10 18:36  店里最会撒谎白玉汤  阅读(16)  评论(0编辑  收藏  举报