原文地址 https://www.heayan.com/articles/2018/03/12/1520870344102.html
前言
性能问题是在项目最后阶段,必须要面对的核心问题。性能优化工作,不会出现在项目前期、中期阶段。在这些阶段,项目还没有稳定下来,进行项目优化并没有有效的切入点、侧重点,也不能确定哪些地方需要优化,哪些地方不需要优化。如果产品设计的合理变动,可能导致前期优化工作的浪费,从而导致重复性工作。所以,性能优化一般放在项目最后阶段,由测试工程师协助发现突出的性能问题,针对性解决。
性能优化一般针对服务器性能、程序性能、数据库性能三个方面进行优化。
程序性能
程序性能优化的核心是,降低代码量、降低 IO 频率、降低特殊功能开销、降低内存使用。
- 算法优化。
主要目的就是降低代码量。使用合适的算法,解决工作中问题,能够有效的提升性能。
如:使用快速排序算法代替冒泡排序算法,来降低程序执行时间。 - 降低 SQL 使用频率。
主要目的是,降低 SQL 使用量,尽量避免在循环中使用 SQL,避免复杂 SQL 出现。因为每次 SQL 执行,需要 IO、SQL 解析、SQL 执行,SQL 使用频次会增加 IO 和 SQL 解析时间,而这两个方面耗时是非常巨大的。平均每次 SQL 执行需要 3ms,循环使用 SQL 耗时会成倍增加。 - 异常优化。
异常的开销很大,不要有空异常驳回,避免使用异常处理业务异常。 - 线程优化。
线程的创建销毁开销很大,尽量避免频繁创建销毁线程。如:Java 提供的线程池,可以重复利用工作线程。但缺点是,任务线程依然在频繁创建销毁;优点是,Java 提供的线程池具有通用性,把业务和线程隔离开来,管理方便。如果线程已经影响到性能,最好封装针对业务的的线程池。 - 缓存使用。
使用缓存来保存部分数据,减少数据库访问,从而调高性能。缓存分为应用缓存,在系统内部实现;分布式缓存,通过 Memcached、Redis 实现。
数据库性能
数据库优化的核心是,减低 IO 频率、避免复杂 SQL、降低特殊功能开销、降低内存使用。因为数据库耗时主要体现在 IO 传输、SQL 解析、SQL 执行。
SQL 优化
- 判断条件尽量在 SQL 语句中提现。
Oracle 解析引擎,在解析筛选条件时,先从最后一个条件开始,所以尽量将可以过滤大量数据的条件放在 where 最后。 - 返回结果集尽量小
- 尽量减少级联
索引
在百万级、千万级以及以下数据量时,索引的使用,还是能够非常好的提升性能。索引特点是以空间换时间,过多的索引会增加 INSERT、DELETE、UPDATE 的负担,不必要的索引尽量删除,存在空值的字段尽量不要创建索引。
特别注意,SQL 使用时,在下面条件下会导致索引失效。可以通过执行计划,来查看 SQL 执行时,索引是否生效。
以下情况容易导致引擎放弃使用索引而进行全表扫描:
- 对索引字段进行函数操作、算数运算或其他表达式运算
- 在索引列上出现数据类型转换
- 在索引列上使用 <>、!=
- 在索引列上使用 like '%%'(不能前置百分号)
- B-tree 索引 is null 不会走 is not null 会走;位图索引 is null,is not null 都会走
服务器方面
暂无
常见问题
- Oracle 中 in 超过 1000 报错
可以使用 in or in...解决,也可以通过临时表(推荐)解决。 - Oracle 实现树的遍历
select * from BD_SPFL start with bm = '4' connect by sjbm = prior bm; - 很多时候用 exists 代替 in 是一个好的选择
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
版权所有,转载必须标识原文地址
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于