Mysql执行计划

id:

SELECT标识符。这是查询中SELECT的序号。如果该行引用其他行的并集结果,则值可以为NULL。当id相同时,执行顺序 由上向下;当id不同时,id值越大,优先级越高,越先执行。

select_type:

  • SIMPLE:查询中不包含子查询或者UNION。
  • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY。
  • SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询被标记为SUBQUERY。子查询语句的第一个select语句。
  • DEPENDENT SUBQUERY:依赖外部查询的第一个子查询。
  • UNION:若第二个SELECT出现在UNION之后。
  • UNION RESULT:从UNION表获取结果的SELECT。
  • DEPENDENT UNION:在一个UNION查询中,第二次子查询或以后的SELECT查询的时候需要依赖外部的查询。
  • DERIVED:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED。
  • DERIVED(衍生):在FROM列表中包含的子查询被标记为DERIVED(衍生)。

table:

表示查询用到的表名,每行都有对应的表名,表名除了正常的表之外,也可能是以下列出的值:

  • <unionM,N>: 本行引用了id为M和N的行的UNION结果;
  • : 本行引用了id为N的表所产生的的派生表结果。派生表有可能产生自FROM语句中的子查询。
  • : 本行引用了id为 N 的表所产生的的物化子查询结果。

type:

查询执行的类型,描述了查询是如何执行的。所有值的顺序从最优到最差排序为:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

常见的几种类型具体含义如下:

  • system:如果表使用的引擎对于表行数统计是精确的(如:MyISAM),且表中只有一行记录的情况下,访问方法是 system ,是 const 的一种特例。
  • const:表中最多只有一行匹配的记录,一次查询就可以找到,常用于使用主键或唯一索引的所有字段作为查询条件。
  • eq_ref:当连表查询时,前一张表的行在当前这张表中只有一行与之对应。是除了system与const之外最好的join方式,常用于使用主键或唯一索引的所有字段作为连表条件。
  • ref:使用普通索引作为查询条件,查询结果可能找到多个符合条件的行。
  • index_merge:当查询条件使用了多个索引时,表示开启了Index Merge优化,此时执行计划中的key列列出了使用到的索引。
  • range:对索引列进行范围查询,执行计划中的key列表示哪个索引被使用了。
  • index:查询遍历了整棵索引树,与ALL类似,只不过扫描的是索引,而索引一般在内存中,速度更快。
  • ALL:全表扫描。

possible_keys:

possible_keys列表示MySQL 执行查询时可能用到的索引。如果这一列为 NULL ,则表示没有可能用到的索引;这种情况下,需要检查WHERE语句中所使用的的列,看是否可以通过给这些列中某个或多个添加索引的方法来提高查询性能。

key:

key列表示 MySQL 实际使用到的索引。如果为 NULL,则表示未用到索引。

key_len:

key_len列表示 MySQL 实际使用的索引的最大长度;当使用到联合索引时,有可能是多个列的长度和。在满足需求的前提下越短越好。如果key列显示NULL,则key_len列也显示 NULL 。

ref:

ref列显示了在key列记录的索引中表查找值所⽤到的列或常量,常见的有:const(常量),func,null,字段名。

rows:

rows列表示根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好。

filtered

filtered返回结果的行数占读取行数的百分比,值越大越好。

Extra:

这列包含了MySQL解析查询的额外信息,通过这些信息,可以更准确的理解 MySQL 到底是如何执行查询的。常见的值如下:

  • distinct:数据库发现第1个匹配⾏后,停⽌为当前的⾏组合搜索更多的⾏;
  • not exists:数据库能够对查询进⾏LEFT JOIN优化,发现1个匹配LEFT JOIN标准的⾏后,不再为前⾯的的⾏组合在该表内检查更多的⾏;
  • range checked for each record (index map: #):数据库没有发现好的可以使⽤的索引,但发现如果来⾃前⾯的表的列值已知,可能部分索引可以使⽤;
  • using filesort(重点):数据库会对结果使⽤⼀个外部索引排序,⽽不是按索引次序从表⾥读取⾏。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和⾏指针,然后排序关键字并按顺序检索⾏信息。这种情况下⼀般也是要考虑使⽤索引来优化的;
  • using index(重点):从只使⽤索引树中的信息⽽不需要进⼀步搜索读取实际的⾏来检索表中的列信息,即表示select使用了覆盖索引而不必去回表查询;
  • using temporary(重点):数据库需要创建⼀张临时表来处理查询,这种情况常见于order by和group by。出现这种情况⼀般是要进⾏优化的,⾸先是想到⽤索引来优化;
  • using where:数据库将在存储引擎检索⾏后再进⾏过滤。就是先读取整⾏数据,再按where条件进⾏检查,符合就留下,不符合就丢弃;
  • using index condition:与Using where类似,查询的列不完全被索引覆盖,where条件中是⼀个前导列的范围;
  • using sort_union(…), Using union(…), Using intersect(…):这些函数说明如何为index_merge联接类型合并索引扫描;
  • using index for group-by:类似于访问表的Using index⽅式,Using index for group-by表示数据库发现了⼀个索引,可以⽤来查 询group by或distinct查询的所有列,⽽不要额外搜索硬盘访问实际的表;
  • null:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着⽤到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地⽤到了索引,也不是完全没⽤到索引,即使用了索引但需要回表操作,应该避免回表操作。
  • Using join buffer (Block Nested Loop):连表查询的方式,表示当被驱动表的没有使用索引的时候,MySQL会先将驱动表读出来放到 join buffer 中,再遍历被驱动表与驱动表进行查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值