SQL语句编写的那些坑,你踩了几个?

前言
金九银十,又到了一年的程序员跳槽季,最近总有一些朋友在问数据库的问题,说面试的时候总是被问到,虽然知道一些,但是要完整的表达还是欠缺的,想了想与其一个一个解答,不如做个数据库优化问题集锦,供所有的有这个方面需要的朋友参考。
一些SQL优化建议

首先要强调一点:一个SQL语句要尽量简单,不要嵌套太多层。有的开发者喜欢用多层嵌套语句,如果你是大学生尚可用来玩一玩,真正到企业级应用了,奉劝你还是用简单的SQL语句吧。

如何简化?
简化目的其一就是避免多次扫描主表,我们来归纳下,在何种情况下会引发扫描主表。
1、不使用临时表
采用临时表暂存中间结果,避免程序中多次扫描主表,可以大大减少了阻塞,提高了并发性能。
2、不慎用like的“%”
有的时候会需要进行一些模糊查询,比如

select id from table where username like ‘%rumo%’

关键词%rumo%,由于rumo前面用到了“%”,所以该查询采用全表扫描,在一般情况下不要再关键词前加%,除外硬性要求全表扫描。

3、使用 or 来连接条件
在where子句中使用or来连接条件,引擎将放弃索引而采用全表扫描。
建议使用

select id from t where num=10
union all
select id from t where num=20
替代
select id from t where num=10 or num=20
4、使用!=或<>操作符
在where语句中使用!=或<>,引擎将放弃索引而采用全表扫描

5、使用in和not in
在 where 子句中使用 in和not in,引擎将放弃索引而采用全表扫描

6、不使用索引
可以考虑强制查询使用索引
select * from table force index(PRI) limit 2;(强制使用主键)

select * from table force index(rumo_index) limit 2;(强制使用索引”rumo_index”)

select * from table force index(PRI,rumo_index) limit 2;(强制使用索引”PRI和rumo_index”)

7、使用表达式、函数等操作作为查询条件
除非必要,不要使用

8、大事务操作
除非必要,不要使用,需要提高系统的高并发能力,最近我也一直在研究高并发性能,如有好的想法可以跟我们一起讨论。我们的组织扣qun是860170416

9、使用游标

10、 select * from t ,放弃具体字段
在使用查询语句的时候尽量用具体的字段,不要使用*,避免返回不必要的字段。
11、使用 char/nchar
尽量用varchar/nvarchar 代替 char/nchar,要知道提高字段的匹配度可以提高系统性能及节约资源。

12、不使用数字型字段
有的开发者图省事,无论什么字段统统用字符型,这个习惯可不好,这样不仅降低了存储开销,还会降低查询和连接的性能。

13、慎用索引
索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率
并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。

java的那些年微信号: java1024_
福利送上不谢:
1、关注java的那些年公众号,每期分享java技术干货
2、关注java的那些年能查看更多历史干货
3、点关注的,今年都脱单

你可能感兴趣的:(Java,面试,程序员,分布式,阿里巴巴)