说下执行计划?

#每天一道面试题# 51

在生产过程中,经常会遇到因为SQL语句导致的性能瓶颈问题,这时候就需要我们去优化SQL的执行效率;EXPLAIN语句的各个输出项指标可以帮助我们有针对性的提升查询语句的性能。

const: 根据主键、普通唯一索引列等值匹配查询(is null除外),这种查询是很快的,查询速率认为是常数级别的,定义为const。 ref : 根据普通索引等值匹配,或is null。(前面说的普通唯一索引列查询时 is null也是这种场景)。这种方式需要先根据普通索引匹配到多个主键,然后根据主键进行回表。 range:根据主键索引或普通索引(包含唯一索引)进行范围查找 index:索引覆盖,你查询的列刚好是索引列,即使查询条件是联合索引的非最左索引列,查询的条件是联合索引中的列,也可能会走索引覆盖 ALL: 全表扫描,直接扫描主键索引,这种访问方式称为all。 index merge : 除此之外,还会有index merge(索引合并),针对一些and、or的操作,单纯的回表可能速度会慢一些,如果先将使用到的索引先进行求 交集、并集之后在进行回表,会更加高效。

执行计划重要指标解释(id主键,name,age 联合索引, a 普通索引,b普通列):

type 字段 =>>

​ ALL - 最牛的优化结果这里就不展开介绍了

​ range - 索引范围查询;

​ ref - 二级索引等值查询;

​ const - 主键/唯一索引等值查询;

​ index_merge - 多个索引查询;

​ index - 覆盖索引且需要扫描全部的索引;

​ eq_ref - 被连接表主键/唯一引等值查询;

possible_keys 字段 =>> 可能用到的索引(备胎);

key 字段 =>> 实际用到的索引(转正);

key_len 字段 =>> 实际使用索引的最大长度

ref 字段 =>> 等值查询有一个常数/列值

​ const - 索引等值查询;

​ [DB].[table].[column] - 被调用表索引列等值查询;

Extra字段 =>>

​ Impossible WHERE - where false;

​ Using index - 覆盖索引;

​ Using index condition - 索引下推;

​ Using where - 顺序扫描,where条件查询。

下面几张图说明了具体出现的场景: