前言
在面试过程中,经常会被问到,如果sql语句执行耗时过长,该如何优化sql,提高查询效率,在此我根据自己的实际经验,做如下总结。
一、EXPLAIN分析SQL语句
sql优化经常用到EXPLAIN来查看sql语句的执行计划,以下5点是我们重点关注的地方
EXPLAIN执行sql语句以后显示的执行计划
1、type列
通过type字段,我们可以判断出此次查询是全表扫描还是索引扫描,一个好的sql语句至少达到range级别,避免出现all级别(全表扫描)。
type列常用取值如下:
system:表中只有一条数据, 这个类型是特殊的const类型。
CONST:针对主键或唯一索引的等值查询扫描,最多只返回一行数据,const 查询速度非常快, 因为它仅仅读取一次即可。
eq_ref:表示对于前表的每一个结果,都只能匹配到后表的一行结果,并且查询的比较操作通常是=,查询效率较高。
ref:此类型通常出现在多表的join查询,针对于非唯一或非主键索引,或者是使用了最左前缀规则索引的查询。
range:表示使用索引范围查询,通过索引字段范围获取表中部分数据记录,
这个类型通常出现在 =, <>, >, >=, , BETWEEN, IN() 操作中。
index:表示全索引扫描(full index scan),和ALL类型类似,只不过 ALL类型是全表扫描