MySql之explain 优化器字段类型解析

1)先不创建索引,使用explain查询。
explain select * from example where name="张三";`

MySql之explain 优化器字段类型解析_字段

2)创建gid,cid,uid三列的联合索引后再使用explain查询
explain select name,gid,cid,uid from example where gid=10010;

MySql之explain 优化器字段类型解析_ci_02

explain优化器返回的字段大概有12个字段。下面是常用的类型有:

ALL — MySQL将遍历全表以找到匹配的行(全表扫描)

index —index与ALL区别为index类型只遍历索引树

range —只检索给定范围的行,使用一个索引来选择行

ref —表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref —类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

const —当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。

system —system是const类型的特例,当查询的表只有一行的情况下,使用system

type从好到坏的次序
system > const > eq_ref > ref > fulltext > ref_or_null >
  index_merge > unique_subquery > index_subquery > range > index > ALL


explain两个变形


  • explain extended

explain extended select * from tableName where id = 1;
show warnings;
会在 explain 的基础上额外提供一些查询优化的信息。紧随其后通过 show warnings 命令可以得到优化后的查询语句,
从而看出优化器优化了什么。额外还有 filtered 列,是一个百分比的值,rows * filtered/100 
可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
  • explain partitions
相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。