读懂explain

explain

  • id:执行顺序,数字越大优先级越高
  • select_type:每个子句的类型
    • simple:不包含子查询和union
    • PRIMARY:内部包含子查询
    • SUBQUERY:子查询(select和where中的)
    • DERIVED:子查询(from中的)
    • UNION:出现在UNION后
    • UNION RESULT:从union的表中获取结果
  • table:来自哪张表
  • type:在表中查询用哪种方式
    • all:全表扫描
    • index:遍历整个索引树,索引扫描,因为是内部有链表结构,所以速度很快 select id from tb
    • range:对索引范围进行扫描 select * from tb where id between 1 and 5
    • ref:非唯一索引扫描,返回匹配某个单独值的所有行
    • eq_ref:唯一索引进行扫描,对于每个索引键,表中只有一条记录与之匹配
    • const、system:mysql进行优化,唯一锁定一条数据,将其转换为常量,在where中使用主键,如果是联合主键,就是所有的主键值一起使用
    • null:不访问表或者索引
  • possible_keys:字段上所有涉及的索引,但是不一定使用
  • key:使用的索引
  • key_len:索引字段的长度
  • ref:哪些列或者常量被用来查询索引
  • rows:估算出扫描的行数
  • Extra:
    • Using index:索引覆盖
    • Using where:使用where子句过滤
    • Using filesort:无法利用索引完成排序为文件排序
    • Using index condition:查找使用了索引,但是需要回表查询数据,mysql开启了ICP的话,可以减少存储引擎访问基表的次数
      https://www.cnblogs.com/zhp-king/p/7250810.html

实际分析

  • extra是using index,意思就是索引覆盖
  • extra是using where,type是ref,表明虽然用到了索引,但是没有索引覆盖,产生了回表。
  • extra是using where using index,type是ref,表明用到了索引,索引也覆盖了,using where代表发生了过滤
  • extra是using where using index,type变成了index,这表明发生了索引扫描
  • extra是using index,type是const,代表引擎根据主键直接取出了唯一的数据,因为是唯一的数据,所以没有using where。同时还索引全覆盖
  • extra变成了null,type还是const,因为没有索引覆盖,回表拿数据了
  • extra都为using where,type是all,代表是全表扫描后过滤

参考:https://blog.csdn.net/jeffrey11223/article/details/79100761

trace

  • 也可以使用trace来获取sql语句执行时的选择逻辑

猜你喜欢

转载自blog.csdn.net/designer01/article/details/82318583