Explain执行计划分析

发布时间 2023-04-23 16:19:14作者: {小小胡}

id

操作的唯一标识,值越大的操作越先执行

select_type

操作的类型,不同类型的查询效率不同.包括:

  • simple,简单的select语句,查询中不包含自查询或者union
  • primary,查询若包含任何复杂的子部分,最外层查询则被标记为primary
  • subquery,在select或where列表中包含子查询
  • derived,在from列表中包含自查询被标记为derived(衍生)MySQL会递归执行这些自查询,把结果放在临时表中
  • union,若第二个select出现在union之后,则被标记为union.若 union包含在from子句子查询中,外层select将别标记为derived
  • union result,从union表中获取结果的select

table

操作涉及的表

partitions

操作涉及的分区

type

查询使用的索引类型,按照性能排序如下
:::info
system > const > eq_ref > ref > range > index > all
:::

**system **

系统级,基本不会出现,忽略不计

count

常数索引,一般出现在使用唯一索引进行唯一性查询

eq_ref

唯一索引,只扫描一个匹配行

ref

非唯一索引,只扫描索引树的一小部分查找匹配行

range

范围扫描,使用索引范围查询,扫描索引树的一个范围查找匹配行

index

全索引扫描,遍历整个索引树查找匹配行,一般出现在不符合最左原则的查询

all

全表扫描,遍历全表查找匹配行,非索引字段查询

总结:

按照经验,查询应该优化到至少range级别,能达到ref最好

possible_keys

可能被查询优化器选择使用的索引

key

优化器选择使用的索引

key_len

索引的长度.长度越短,查询效率越高

ref

连接操作使用的索引

rows

操作需要扫描的数据行数

filtered

操作过滤掉的函数与扫描的行数的百分比.数值越大,查询得越准确

extra

额外信息,不在前面的列但是非常重要的其他信息,常见信息如下:

  • Using filesort

使用文件排序,发生在无法使用索引排序时

  • Using temporary

临时表保存中间结果;常见于排序order by和分组group by

  • Using index

覆盖索引

  • Using index condition

索引下推

  • Using where

未索引覆盖,使用了where过滤

  • Using join buffer

使用了链接缓存

  • impossible where

where条件子句总是false

  • distinct

优化distinct操作,在找到第一匹配的值后立即停止找相同值的动作