MySQL执行计划

今天也是需要努力的一天 💪💪 🦆🦆

EXPLAIN SELECT * FROM base_village WHERE id < 100;

🗨🗨🗨接下来看一下,该怎么看这个执行计划吧

id

  • select查询序列号
  • id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行

select_type

  • SIMPLE : 简单的select 查询,查询中不包含子查询或者UNION
  • PRIMARY : 查询中若包含任何复杂的子查询,最外层查询则被标记为primary
  • SUBQUERY : 在select或where 列表中包含了子查询
  • DERIVED : 在from列表中包含的子查询被标记为derived(衍生)MySQL会递归执行这些子查询,把结果放在临时表里
  • UNION : 表示此查询是 UNION 的第二或随后的查询
  • UNION RESULT : 从UNION表获取结果的select结果
  • DEPENDENT UNION :UNION 中的第二个或后面的查询语句, 取决于外面的查询
  • DEPENDENT SUBQUERY : 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果

type

  • system:表中只有一条数据. 这个类型是特殊的 const 类型.
  • const: 针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可
  • eq_ref: 此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高
  • ref: 此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询
  • range: 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中.
  • index: 表示全索引扫描(full index scan), 和 ALL 类型类似, 只不过 ALL 类型是全表扫描, 而 index 类型则仅仅扫描所有的索引, 而不扫描数据.
  • all: 表示全表扫描
    效率:
    all< index < range ~ index_merge < ref < eq_ref < const < system

key

  • 查询过程中使用到的索引

key_len

  • 表示索引中使用的字节数,通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好显示的是索引字段的最大长度,并非实际使用长度

ref

  • 显示该表的索引字段关联了哪张表的哪个字段

rows

  • 读取的数据行数,值越小越好

filtered

返回结果的行数占读取行数的百分比,值越大越好

Extra

-- using filesort:说明 MySQL 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。出现该值,应该优化 SQL
-- using temporary:使用了临时表保存中间结果,MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。出现该值,应该优化 SQL
-- using index:表示相应的 select 操作使用了覆盖索引,避免了访问表的数据行,效率不错
-- using where:where 子句用于限制哪一行
-- using join buffer:使用连接缓存
-- distinct:发现第一个匹配后,停止为当前的行组合搜索更多的行

posted @ 2019-12-24 16:56  VVII  阅读(198)  评论(0)    收藏  举报