系统设计时关于性能问题处理的几点心得

openkk 12年前

【将复杂的运算分解到其它过程】

此种思想将整个系统的操作看成一个整体,类似于负载均衡。在系统中常见的一个问题是,数据量比较大,对数据的查询统计变得很复杂很缓慢。对于这种问题应该在设计时就进行考虑,建立表的冗余字段或者汇总表存储一些汇总信息,在录入或更新数据时计算冗余字段或汇总表的值。这样将复杂的运算时间分解到了数据录入修改的时间。而一般的录入/修改都是单笔的操作,此时的一点点延时(可能很少很少)对用户的体验是没有什么影响的,而进行查询统计时变成了直接查询表,也会变得很快。

 

【将多次查询简化为一次查询】

将多次查询简化为一次查询,可以减少数据库连接的性能消耗。对于此种思路,我认为可以有三种实现:

1. 通过视图,将多次查询的结果直接通过一条语句计算查询

    此种方式可能会用到sum,group by等语句,但使用不好,往往是性能变的更差,不建议使用。对于视图最好只是简单的表的关联,不涉及数据的运算。

2. 使用存储过程或函数

    接收参数,将运算封装在存储过程或函数中,理论上,参数越精确,操作的数据越少,速度也越快。但问题是1.不易维护;2.要能够灵活的查询程序就比较复杂。

3. 在代码中进行查询或计算

   由于要在代码中进行计算,所以可能很多性能的消耗是在多次连接数据库查询数据上。设计代码结构时需要将多次取数改成有限次的取数,在代码中对数据进行整理,同时对于重复的数据需要使用缓存。

 

【通过用户体验减少使用者的影响】

曾经有一个很慢的查询,用户点击查询按钮后,等了10秒钟,数据才出来,这个时间内屏幕没有任何变化,从心理上感觉,似乎等待了很长时间;

后来添加了一个滚动的进度条,有个进度条,是可以知道系统并没有死掉仍在运行,但滚动条滚动的速度太快,用户感觉过了很长很长时间数据才出来;

最后修改了一下滚动条动画,将滚动速度调慢,10秒种的时间滚动条只滚动了两次,数据处理的时间没有变化,但心理上感觉似乎比以前快了很多。

 

【使用缓存技术】

对于经常操作的数据库数据,需要添加查询缓存。可在查询时将查询结果放入缓存,在增删改数据时清空缓存。在ibatis、hibernate等orm框架中都支持缓存,另外OSCache这样的缓存框架也提供了更多的功能。

 

【SQL优化】

我的感觉,如果有好的SQL编写形成,一般是用不到SQL优化的。但有时候一个不好的SQL,优化后可能会得到性能质的提升。

 

【设计产品操作方式】

在产品设计时也要考虑性能的问题,通过分页、将数据分步骤展示等方式,防止将大量的数据直接展现。

转自:http://blog.csdn.net/scorpio3k/article/details/7888722