sql优化系列之explain执行计划

关于explain执行计划,这些知识点,你不得不知道,否则你怎么敢说你做过sql调优呢???

explain 用处

当explain和sql一起使用时,mysql会显示来自优化器关于sql执行的信息。也就是说,mysql会解释它将如何处理该sql语句,包括是否会使用索引,可能使用到的索引,以及最终使用的索引,表链接及顺序等等。所以学会查看explain执行计划非常重要。

explain所有字段

总的来说,explain包含如下字段:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、extra共12个字段

explain各字段含义

  • id

    • 标示查询中执行select子句或操作表的顺序,id的值越大,代表优先级越高,越先执行。(1)id都相同,则表示多个表具有同样的优先级,执行顺序由上而下,(2)id不同,如果sql中存在子查询,那么id的序号会递增,id越大优先级越高越先被执行,当多表依次嵌套,发现最里层的子查询id最大,最先执行。
  • select_type

    • 表示查询的类型,主要用于区分各种复杂的查询,例如:普通查询、联合查询、子查询等。
    • SIMPLE: 表示最简单的select查询语句,也就是查询中不包括子查询或者union等。
    • PRIMARY: 当查询语句中包含任何复杂的子部分,最外层的查询被标记为PRIMARY
    • SUBQUERY: 当select或where列表中包含了子查询,该子查询被标记为SUBQUERY
    • 另外还有 DERIVED、UNION、UNION RESULT
  • table

    • 查询的表名字,并不一定是真实存在的表,有别名显示别名,也可能为临时表。
  • partitions

    • 查询时匹配到的分区信息,对非分区表值为NULL,当查询分区表时,partitions显示分区表命中的分区情况。
  • type

    • 查询使用了何种类型,它是一项重要指标,性能从好到坏依次是: system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > All
    • system: 当表只有一行记录时,数据量很少,往往不需要磁盘io,速度非常快。
    • const:查询命中primary key主键或者unique唯一索引,或者被连接的部分是一个常量值,这类扫描效率极高,返回数据量少,速度非常快。
    • eq_ref:查询时命中primary key主键或者unique key索引,type就是eq_ref。
    • ref: 区别于eq_ref,ref表示使用非唯一索引,会找到很多个符合条件的记录。
    • ref_or_null:这种连接类型类似于ref,区别在于mysql会额外搜索包含null的行。
    • index_merge:使用了索引合并优化方法,查询使用了两个以上的索引。
    • range: 在where语句中使用between and、> 、< 、in 等条件查询type都是range
    • index: index和all其实都是读取全表,区别在于index是便利索引树,而all是从硬盘中读取。
    • all :遍历全表,性能最差。
  • possible_keys

    • 查询可能会使用到的索引,但并不一定是最终查询时真正使用的索引。
  • key:区别于possible_keys, key时查询时实际使用到的索引,若没有使用索引,显示为null

  • key_len

    • 表示查询用到的索引长度即字节数,原则上长度越短越好。
  • ref:

    • 常见的有:const, func,null,字段名。当使用常量等职查询时显示const,当使用关联查询时,会显示关联表的关联字段,如果查询使用了函数、隐士转换、表达式等显示为func,其他情况为null
  • rows

    • 查询到我们需要的数据需要读区的行数, 值越小越好
  • filtered

    • 这个时一个百分比的值,表示符合条件的记录数的百分比。

你可能感兴趣的:(後端服務,数据库)