关于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
- 这个时一个百分比的值,表示符合条件的记录数的百分比。