您的当前位置:首页正文

Explain-MySQL

2020-03-22 来源:意榕旅游网
MySQL的EXPLAIN命令用法

explain显示了mysql如何处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

先解析一条sql语句,看出现什么内容

好,接下来咱们就看看出现的这几行所代表的含义! 1、id

SELECT识别符,这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序

2、select_type

select类型,它有以下几种值:

simple:它表示简单的select,没有union和子查询

primary:最外面的select,在有子查询的语句中,最外面的select查询就是primary union:union语句的第二个及以后的子查询

dependent union:UNION中的第二个及以后的子查询语句,取决于外面的查询 union result:UNION的结果

subquery:子查询中的第一个select语句

dependent subquery:依赖于外查询的子查询中的第一个select derived:子查询衍生出来的表 materialized:物化子查询

uncacheable subquery:不能被缓存,需要重新评估的子查询

uncacheable union:union中第二个及以上的uncacheable subquery中需要重新评估的子查询 3、table 输出的行所用的表 4、type

访问类型,表示在自己查找的方式,从最好到最差的连接类型为null、const,system、eq_reg、ref、range、index、all

null:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引

system:表仅有一行,这是const类型的特列,平时不会出现,这个也可以忽略不计 const:表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。记住一定是用到primary key或者unique,并且只检索出两条数据的情况下才会是const

eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY\"。eq_ref可以用于使用=比较带索引的列。

ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联

接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。 fulltext:使用全文索引

ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。

index_merge:该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。 unique_subquery:在带有in的子句中用来代替ref index_subquery:类似于unique_subquery,查询条件

range:给定范围内的检索,使用一个索引来检查行,用到=、<>、>、<、>=、<=、is null、<=>、between、in

ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。

index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)

5、possible_keys

提示使用哪个索引会在该表中找到行

6、keys

查询实际用到的索引

7、key_len

实际用到的索引的字节数,该值是从表定义中计算而来,并非索引实际使用长度 8、ref

ref列显示使用哪个列或常数与key一起从表中选择行。 9、rows

显示执行查询的行数,数值越大越不好,说明没有用好索引

10、Extra

查询语句的额外信息

我们再使用explain查看SQL执行计划是,要着重注意以下几点: 1、type

如果类型是all,则表示走的全表扫描,这个代价很大,建议创建适当的索引或者使用带有索引的字段作为查询条件

此外,全索引扫描(full index scan)的代价有时候是比全表扫描还要高的,除非是基于InnoDB表的主键索引扫描。

2、Extra

Using temporary,表示需要创建临时表,通常是因为GROUP BY的列没有索引,或者GROUP BY和ORDER BY的列不一样,也需要创建临时表,建议添加适当的索引。

Using filesort,表示无法利用索引完成排序,也有可能是因为多表连接时,排序字段不是驱动表中的字段,因此也没办法利用索引完成排序,建议添加适当的索引。

Using where,通常是因为全表扫描或全索引扫描时(type 列显示为 ALL 或 index),又加上了WHERE条件,建议添加适当的索引。

因篇幅问题不能全部显示,请点此查看更多更全内容