关注私信小姐姐,分享更多程序员踩过的坑,以及高级JAVA开发学习资料。
分享sql性能优化的几点注意,供参考。实际项目中都是根据实际脚本执行计划进行分析,找问题,然后解决问题。如果能在开发过程中遵守一些规范,那就能减少后续优化的时间。
1. 尽量使用prepareStatement,利用预处理功能。
2. 在进行多条记录的增加、修改、删除时,建议使用批处理功能,批处理的次数以整个SQL语句不超过相应数据库的SQL语句大小的限制为准。
3. 建议每条SQL 语句中in中的元素个数在500以下,如果个数超过时,应拆分为多条SQL语句。禁止使用xx in(‘’,’’….) or xx in(‘’,’’,’’)。
4. 禁止使用or 超过 500,如 xx =’123’ or xx=’456’。
5. 尽量不使用外连接。
6. 禁止使用not in 语句,建议用not exist。
7. 禁止使用Union, 如果有业务需要,请拆分为两个查询。
8. 禁止在一条SQL语句中使用3层以上的嵌套查询,如果有,请考虑使用临时表或中间结果集。
9. 尽量避免在一条SQL语句中从>= 4个表中同时取数,对于仅是作为过滤条件关联,但不涉及取数的表,不参与表个数计算;如果必须关联4个或4个以上表,尽量采用子查询的方式。
10. 尽量避免使用order by和group by排序操作,因为大量的排序操作影响系统性能。如必须使用排序操作,尽量建立在有索引的列上。
11. 对索引列的比较,尽量避免使用NOT 或 !=,可以考虑拆分为几个条件。如col1 是索引列,条件col1 !=0 可以拆分为col1 >0 or col2 <0
12. 任何对列的操作都将导致表扫描,所以应尽量将数据库函数、计算表达式写在逻辑操作符右边。
13. 在对char类型比较时,建议不要使用rtrim()函数,应该在程序中将不足的长度补齐。
14. 用多表连接代替EXISTS子句。
15. 如果有多表连接时,应该有主从之分,并尽量从一个表取数, 如select a.col1, a.col2 from a join b on a.col3=b.col4 where b.col5 = ‘a’。
16. 在where子句中,如果有多个过滤条件,应将索引列或过滤记录数最多的条件应该放在前面。
17. 在使用Like时,建议Like 的一边是字符串,表列在一边出现。
18. 不允许将where子句的条件放到having中。
19. 将更新操作放到事务的最后执行。
20. 一个事务需更新多个对象时,需保证更新的顺序一致以避免死锁的发生。
21. 多表关联查询时,如有冗余字段条件,需对冗余字段做关联。
22. 禁止随意使用临时表,在临时数据不超过200行的情况下禁止使用临时表。
23. 禁止随意使用distinct,避免造成不必要的排序。