MySQL之——执行计划(Explain)

当一条SQL语句执行时间过长怎么办,想优化一条SQL语句怎么办?

可以通过MySQL的执行计划来解决,语法:Explain + SQL语句

 

执行计划显示出来共有10个字段,依次为:id 、select_type、table、type、possible_keys、key、key_len、ref、rows、extra

其中id 、type、key、rows、extra这5个为比较重要的信息。

下面来逐一介绍下这些参数:

 

一、id

select查询的序列号,可以看出select子句执行的顺序,分为三种情况:

1、id全部相同,执行的顺序将由上至下。

2、id全部不同,id数字越大,优先级越高,越先被执行。

3、id有的相同,有的不同,执行情况为两者结合,id相同的部分执行顺序由下至上,不同部分id越大,越先被执行。

 

二、select_type

查询的类型,主要用于区分普通查询、连接查询、子查询等复杂的查询。

 

三、table

直接显示表名,或者表的别名。

 

四、type

访问的类型,SQL查询优化中一个很重要的指标,结果从好到坏依次是:null、system、const、eq_ref、ref、range、index、all

一般来说,一个较好的SQL查询语句,至少达到range,最好可以达到ref。

null:无需访问表或者索引,比如获取一个索引列的最大值或者最小值。

system:系统表,少量数据,无需进行磁盘的IO。

const:主键或者唯一索引上的等值查询。

eq_ref:主键或者唯一索引上的join查询,对于前表的每一行,后表只有一行命中。

ref:非唯一索引,对于前表的每一行,后表可能有多行命中。

range:索引上的范围扫描,例如:where、in、<、>。

index:索引上的全集扫描,例如:InnoDB搜索引擎中的count操作。

all:全表扫描。

 

五、possible_keys

查询中可能用到的索引。

 

六、key

实际使用的索引,如果为NULL,则没有使用索引。

 

七、key_len

表示使用的索引的长度,该值越小越好。

 

八、ref

表示连接查询的连接字段。

 

九、rows

估计此次查询所需读取的行数。

 

十、extra

十分重要的额外信息:

1、Using filesort:在一个没有建立索引的列上使用了order by或group by,就会触发filesort,这类语句性能较低,需要进行优化。

2、Using temporary:需要建立一个临时表来暂存中间结果。例如:order by和group by 同时存在,且作用于不同的字段也无索引。这类语句性能也很低,同样需要进行优化。

3、Using index:说明SQL语句所返回的所有列数据,均在同一颗索引树上,无需访问实际的行记录,这类语句性能往往较好。

4、Using index condition:说明确实命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。这类语句性能也比较好,但不如Using index。

5、Using where:说明结果集中使用了where过滤条件。

6、Select tables optimized away:基于索引优化MAX / MIN操作,或者MyISAM搜索引擎中优化count(*)操作。它是直接从表信息中就能获取结果,无需执行select操作。

7、Using join buffer:表示SQL语句使用了关联查询和子查询,需要进行嵌套循环操作。这类SQL性能很低,需要进行优化,常用的优化方案是,在关联字段上建立索引,避免每次嵌套循环计算。

 

posted @ 2021-02-03 22:38  每天努力一小步  阅读(293)  评论(0)    收藏  举报