前言
金九银十,又到了一年的程序员跳槽季,最近总有一些朋友在问数据库的问题,说面试的时候总是被问到,虽然知道一些,但是要完整的表达还是欠缺的,想了想与其一个一个解答,不如做个数据库优化问题集锦,供所有的有这个方面需要的朋友参考。
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语句编写的那些坑,你踩了几个?
9、使用游标
10、select*fromt,放弃具体字段
在使用查询语句的时候尽量用具体的字段,不要使用*,避免返回不必要的字段。
11、使用char/nchar
尽量用varchar/nvarchar代替char/nchar,要知道提高字段的匹配度可以提高系统性能及节约资源。
12、不使用数字型字段
有的开发者图省事,无论什么字段统统用字符型,这个习惯可不好,这样不仅降低了存储开销,还会降低查询和连接的性能。
13、慎用索引
索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率
并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。
还有最后一句话与君共勉: