查询类型-type

const

  • 常量级的查询
  • 查询直接使用唯(unique key)一索引进行查询

    ref

  • 查询使用普通索引,并不是唯一索引

  • 查询使用类似“name is null”这样条件,即使name是主键索引或唯一索引,查询类似也是ref

    eq_ref

  • 例如:select * from t1 inner join t2 on t1.id=t2.id

  • t1表进行all查询
  • 对t2表进行基于主键的等值匹配:eq_ref

    ref_or_null

  • 如果是类似“select * from table where name=x and name is not null”

  • 查询使用普通索引,并且进行了“not null”这样的判断,那么查询类型是ref_or_null

    range

  • 利用索引进行范围筛选

  • 例如“select * from table where age>x”,其中age是普通索引

    index

  • 只需要遍历二级索引页节点就可以拿到查询所需的数据,不需要回表,便是index

  • 例如,一个联合索引“KEY(x1,x2,x3)”,查询语句:“select x1,x2,x3 from table where x2=123”

    all

  • 全表扫描

    特殊情况

  • select * from table where x1=a and x2 =b

  • 如果x1和x2分别都是一个索引,那么查询计划是:从两个非聚集索引树上过滤符合对应条件的数据,然后在内存中取一个交集,然后再去主键索引树上查询数据

    Explain

字段含义

  • id:每个执行计划都会有一个id,一条sql里可能会有多个查询语句多个查询计划
  • select_type:查询类型
    • simple
    • primary
    • subquery:子查询
    • union:union后的查询
    • union result:union查询中,俩表查询后,使用临时表进行合并
    • MATERIALIZED: 子查询物化 ,当表出现在非相关子查询中并且需要进行物化时会出现MATERIALIZED关键词
  • table:sql语句涉及的表
  • partitions:表分区
  • type:即查询类型
  • possible_keys:可能会用到的索引
  • key:实际使用的索引
  • key_len:索引长度
  • ref:
    • const:表示和索引值进行等值匹配的是一个常量值
    • 关联表字段名
  • rows:预估读取数据条数
  • filtered:经过搜索条件过滤后剩余数据的百分比
  • extra
    • using temporary:使用临时表
    • using where:where 条件里使用了除索引外的其他字段
    • using join buffer:提升关联查询性能
    • using filesort:使用文件排序
    • using index:采用覆盖索引
    • Using join buffer (Block Nested Loop) BNL 优化,出现此项则代表多表 JOIN 连接没有走索引