sql会慢很重要的原因就是索引失效,所以在写sql的时候就要注意避免索引失效的情况发生,一般分为以下几点:
1、在表中建立索引的时候,要优先考虑where、group by使用到的字段;
2、避免使用select *,可以用具体的字段代替 * ;
3、避免使用in和or,in可以用between代替,比如select name from t where id in (2,3),可以替换成select name from t where id between 2 and 3。or可以用union代替,比如select name from t where id = 1 or id = 3,可以替换成select name from t where id = 1 union select name from t where id = 3;
4、避免在字段开头进行模糊查询,比如select id from t where username like '%华';
5、避免在where条件等号左侧进行表达式和函数操作,比如select id from t where score - 10 = 1,将表达式和函数操作移动到等号右侧;
6、避免进行null值的判断,比如select name from t where score is null,应该给字段添加默认值,对默认值进行判断,比如select name from t where score = 0;
如果不避免以上操作,都会导致数据库引擎放弃索引进行全表扫描。
除了避免索引失效的情况发生之外,如果执行sql的时候发现很慢,也可以通过explain 加 sql语句的方式进行sql优化。
通过explain + sql语句查看sql执行计划,explain查出来的字段含义:
1、type:意思是sql的执行速度,包括all(全表扫描)、index(全索引扫描,即遍历索引树获取数据,效率比全表扫描好一些)、range(表示利用索引查询的时候限制了查询范围,在指定的范围进行查询,比如=、<、>、in null、between、like、in() )、ref(使用非唯一性的索引进行查询,非唯一性的索引就是允许被索引的字段有重复值)、const(这个表里面最多只有一行记录匹配)。(一般要保证type到range级别,最好到ref)
2、key:当前用到的索引,可以通过更改索引判断哪个索引速度更快,一般用force index强制执行指定索引;
3、table:当前执行的表名;
4、rows:查询数据的预估值,可以看看是否查询过多数据。