通过mysql执行计划分析来优化sql语句

执行计划分析可以在某些重要或者核心的sql语句在运行之前,先分析下看看sql好不好,可以解决表中出现索引问题的一种方法。

DESC SELECT * FROM table WHERE a='xxx';

执行的结果也就是优化器最终选择的

DESC重点关注的列:

table

查询的表

type

查询的类型,在mysql中支持查询的主要分为两大类,一种是全表扫描,一种是索引扫描。

type值的类型:

1、ALL 全表扫描

对于辅助索引<>,not in,like %x%语句会进行全表扫描

2、INDEX 全索引扫描

1)查询需要获取整个索引树,整个索引树要看一遍,也就是要获取的值包含在索引里。

2)联合索引,非最左列作为查询条件时

# 建了一个索引,可以匹配三种,不过需要以a开头。
idx_a_b_c(a,b,c) 可以替代a ab abc
# 这种情况则是全索引扫描
select * from table where b

3、RANGE 索引范围扫描

辅助索引,>,<,>=,<=,in,like,or
主键索引,<>,not in。这些情况会走范围扫描。

4、ref

非唯一性索引,等值查询

5、eq_ref

多表连接时,连接条件使用了唯一索引(uq,pk)。

extra

filesort,文件排序 如果在执行计划中extra列出现filesort,说明在当前语句中有涉及的排序的语句没有走索引,那就需要额外的资源进行排序,CPU资源,IO资源,把数据再次进行排序。可以通过把where条件和排序字段建立联合索引来解决再次排序问题。