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

前言

金九银十,又到了一年的程序员跳槽季,最近总有一些朋友在问数据库的问题,说面试的时候总是被问到,虽然知道一些,但是要完整的表达还是欠缺的,想了想与其一个一个解答,不如做个数据库优化问题集锦,供所有的有这个方面需要的朋友参考。
SQL语句编写的那些坑,你踩了几个?_第1张图片

SQL语句编写的那些坑,你踩了几个?
一些SQL优化建议

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

如何简化?

简化目的其一就是避免多次扫描主表,我们来归纳下,在何种情况下会引发扫描主表。

1、不使用临时表

采用临时表暂存中间结果,避免程序中多次扫描主表,可以大大减少了阻塞,提高了并发性能。

2、不慎用like的“%”

有的时候会需要进行一些模糊查询,比如

selectidfromtablewhereusernamelike‘%rumo%’

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

3、使用or来连接条件

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

建议使用

selectidfromtwherenum=10

unionall

selectidfromtwherenum=20

替代

selectidfromtwherenum=10ornum=20

4、使用!=或操作符

在where语句中使用!=或,引擎将放弃索引而采用全表扫描

5、使用in和notin

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

6、不使用索引

可以考虑强制查询使用索引

select*fromtableforceindex(PRI)limit2;(强制使用主键)

select*fromtableforceindex(rumo_index)limit2;(强制使用索引rumo_index)

select*fromtableforceindex(PRI,rumo_index)limit2;(强制使用索引PRI和rumo_index)

7、使用表达式、函数等操作作为查询条件

除非必要,不要使用

8、大事务操作

除非必要,不要使用,需要提高系统的高并发能力,最近我也一直在研究高并发性能,如有好的想法可以跟我们一起讨论。我们的组织扣qun是860170416
SQL语句编写的那些坑,你踩了几个?_第2张图片

SQL语句编写的那些坑,你踩了几个?
9、使用游标

10、select*fromt,放弃具体字段

在使用查询语句的时候尽量用具体的字段,不要使用*,避免返回不必要的字段。

11、使用char/nchar

尽量用varchar/nvarchar代替char/nchar,要知道提高字段的匹配度可以提高系统性能及节约资源。

12、不使用数字型字段

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

13、慎用索引

索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率

并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。

还有最后一句话与君共勉:
SQL语句编写的那些坑,你踩了几个?_第3张图片

你可能感兴趣的:(Java,程序员,阿里巴巴)