慢查询日志和show profilel 可以让我们定位到慢SQL和具体耗费时间。explain则能够让我们对具体的一条SQL进行分析,可以看一条SQL执行过程中到底是否使用到了索引、表的连接情况,表的连接顺序。
用法:
在任何一条查询sql前,加上explain,例如
这里需要注意的属性:id 、type 和 key,还有ref
id 是查询的序列号,表示执行顺序,id值相同,从上往下执行,id值不同,值越大的越先执行
key 是 代表实际用到的索引
ref 列显示了在哪些列上使用了索引来查找行。它通常包含以下值:
- const:表示只能匹配一行数据的唯一索引。因为只有一行,所以优化器可以将其视为常量。
- func:表示使用了函数或表达式的索引查找。
- NULL:没有使用索引。
- 列名:表示使用了哪个列上的索引来查找行。
type 用来衡量性能,由好到差依次为:
NULL, SYSTEM, CONST, EQ_REF, REF, RANGE, INDEX , ALL
分别的含义是
CONST : 一般是主键(唯一索引)作为索引的情况
ref_eq : 它知道查找结果只有一个,即使用了主键或唯一索引
Ref :查找条件使用了索引,但是不是主键和unique,是其他索引,例如表的id是唯一索引,而查询时使用where name = '' ,name是索引,但不是唯一索引
Range : 是基于索引的,是有范围的索引扫描,同时除了显而易见的between,and以及'>','<'外,in和or也是索引范围扫描。
All : 表示”全表扫描”,即便找到了目标还是会继续扫描
index : 是另一种全表扫描
分析:
根据截图所示,这条查询的 type是RANGE,key是prymary,即性能是RANGE,实际用到的索引是prymary