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性能很低,需要进行优化,常用的优化方案是,在关联字段上建立索引,避免每次嵌套循环计算。
浙公网安备 33010602011771号