执行计划

​ 为了优化Sql语句的执行,需要查看Sql的具体执行过程,以加快Sql语句的执行效率。可以使用explain+sql语句来模拟优化器执行sql查询语句,从而了解mysql是如何处理sql语句的。

Mysql_执行计划

执行计划中包含的相关信息:

属性 含义
id select查询的***,表示查询中执行select字句或操作表的顺序
select_type select语句的类型,主要区分普通查询、联合查询、自查询等
table 表名称
type 访问类型,以何种方式去访问数据
possible_keys 显示可能应用在这张表中的索引,一个或多个
key 实际使用的索引
key_len 索引中使用的字节数
ref 显示索引的哪一列被使用了,如果可能的话,是一个常数
rows MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
extra 辅助的额外信息

id

​ select查询的***,包含一组数字,表示查询中执行select子句或者操作表的顺序。

  • id相同,执行顺序从上到下
  • id不同,如果是自查询,id的序号会递增,id值越大,优先级越高,越先被执行
  • 相同和不同的id值同时存在,相同的被认为是一组,从上至下执行,所有组中,id值越大,优先级越高,越先执行

select_type

​ 用来区分查询的类型

SIMPLE:简单的查询,不包含自查询和union。

PRIMARY:查询中包含任何的复杂查询,最外层查询被标记为primary。

UNION:如果第二个select出现在union之后,则被标记为union。

UNION RESULT:从union表获取结果的select。

SUBQUERY:在select或where列表中包含的自查询。

DERIVED:from子句中出现的自查询,也叫做派生类。

UNCACHEABLE SUNQUERY:表示自查询的结果不能被缓存。

table

​ 对应的行在访问的表名或别名,有可能是临时表或union的结果。

  • 如果是具体的表名,表示从实际存在的物理表中获取数据,也可以是表的别名;
  • 如果表名是derivedN的形式,表示使用了id为N的查询产生的衍生表;
  • 当有union result的时候,表名是union n1,n2等形式,n1,n2表示参与union等id。

type

​ 访问类型,表示用什么样的方式访问数据。

  • all:全表扫描,一般情况这样的sql使用的数据量较大就需要优化;
  • index:全索引扫描,这个比all的效率好,主要有两种情况,一种是需要的数据在索引中可以获取,或者是使用索引进行排序,这样避免了数据的重新排序;
  • range:表示使用索引查询的时候限定了范围,在指定的范围内查询,避免了index的全索引扫描,适用的操作符:>、<、=、>=、<=、<>、IS NULL、LIKE、IN();
  • index_subquery:利用索引关联自查询,不在扫描全表;
  • index_merge:查询过程有多个索引组合使用;
  • ref_of_null:对于某个字段既需要关联条件,也需要null值的情况下,查询优化器会选择这种访问方式;
  • ref:使用非唯一索引进行数据查询;
  • eq_ref:使用唯一索引进行数据查询;
  • const:这个表最多有一个匹配行;
  • system:表只有银行记录,属于const的特例。

possible_keys

​ 显示可能应用在这张表中的索引,一个或者多个。查询涉及到的字段上若存在索引,则会被列出,但是不一定在查询中实际使用。

key

​ 在查询中实际使用的索引,如果是null,则没有使用索引。

key_len

​ 表示索引中使用的字节数,可以通过key_len计算查询中使用的索引长度,在不损失精度的情况下,长度越短越好。

rows

​ MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,这个值是不准确的。反应了sql找了多少条数据。

相关文章: