系统设计时关于性能问题处理的几点心得
2016-10-26 10:32
295 查看
【将复杂的运算分解到其它过程】
此种思想将整个系统的操作看成一个整体,类似于负载均衡。在系统中常见的一个问题是,数据量比较大,对数据的查询统计变得很复杂很缓慢。对于这种问题应该在设计时就进行考虑,建立表的冗余字段或者汇总表存储一些汇总信息,在录入或更新数据时计算冗余字段或汇总表的值。这样将复杂的运算时间分解到了数据录入修改的时间。而一般的录入/修改都是单笔的操作,此时的一点点延时(可能很少很少)对用户的体验是没有什么影响的,而进行查询统计时变成了直接查询表,也会变得很快。
【将多次查询简化为一次查询】
将多次查询简化为一次查询,可以减少数据库连接的性能消耗。对于此种思路,我认为可以有三种实现:
1. 通过视图,将多次查询的结果直接通过一条语句计算查询
此种方式可能会用到sum,group by等语句,但使用不好,往往是性能变的更差,不建议使用。对于视图最好只是简单的表的关联,不涉及数据的运算。
2. 使用存储过程或函数
接收参数,将运算封装在存储过程或函数中,理论上,参数越精确,操作的数据越少,速度也越快。但问题是1.不易维护;2.要能够灵活的查询程序就比较复杂。
3. 在代码中进行查询或计算
由于要在代码中进行计算,所以可能很多性能的消耗是在多次连接数据库查询数据上。设计代码结构时需要将多次取数改成有限次的取数,在代码中对数据进行整理,同时对于重复的数据需要使用缓存。
【通过用户体验减少使用者的影响】
曾经有一个很慢的查询,用户点击查询按钮后,等了10秒钟,数据才出来,这个时间内屏幕没有任何变化,从心理上感觉,似乎等待了很长时间;
后来添加了一个滚动的进度条,有个进度条,是可以知道系统并没有死掉仍在运行,但滚动条滚动的速度太快,用户感觉过了很长很长时间数据才出来;
最后修改了一下滚动条动画,将滚动速度调慢,10秒种的时间滚动条只滚动了两次,数据处理的时间没有变化,但心理上感觉似乎比以前快了很多。
【使用缓存技术】
对于经常操作的数据库数据,需要添加查询缓存。可在查询时将查询结果放入缓存,在增删改数据时清空缓存。在ibatis、hibernate等orm框架中都支持缓存,另外OSCache这样的缓存框架也提供了更多的功能。
【SQL优化】
我的感觉,如果有好的SQL编写形成,一般是用不到SQL优化的。但有时候一个不好的SQL,优化后可能会得到性能质的提升。
【设计产品操作方式】
在产品设计时也要考虑性能的问题,通过分页、将数据分步骤展示等方式,防止将大量的数据直接展现。
此种思想将整个系统的操作看成一个整体,类似于负载均衡。在系统中常见的一个问题是,数据量比较大,对数据的查询统计变得很复杂很缓慢。对于这种问题应该在设计时就进行考虑,建立表的冗余字段或者汇总表存储一些汇总信息,在录入或更新数据时计算冗余字段或汇总表的值。这样将复杂的运算时间分解到了数据录入修改的时间。而一般的录入/修改都是单笔的操作,此时的一点点延时(可能很少很少)对用户的体验是没有什么影响的,而进行查询统计时变成了直接查询表,也会变得很快。
【将多次查询简化为一次查询】
将多次查询简化为一次查询,可以减少数据库连接的性能消耗。对于此种思路,我认为可以有三种实现:
1. 通过视图,将多次查询的结果直接通过一条语句计算查询
此种方式可能会用到sum,group by等语句,但使用不好,往往是性能变的更差,不建议使用。对于视图最好只是简单的表的关联,不涉及数据的运算。
2. 使用存储过程或函数
接收参数,将运算封装在存储过程或函数中,理论上,参数越精确,操作的数据越少,速度也越快。但问题是1.不易维护;2.要能够灵活的查询程序就比较复杂。
3. 在代码中进行查询或计算
由于要在代码中进行计算,所以可能很多性能的消耗是在多次连接数据库查询数据上。设计代码结构时需要将多次取数改成有限次的取数,在代码中对数据进行整理,同时对于重复的数据需要使用缓存。
【通过用户体验减少使用者的影响】
曾经有一个很慢的查询,用户点击查询按钮后,等了10秒钟,数据才出来,这个时间内屏幕没有任何变化,从心理上感觉,似乎等待了很长时间;
后来添加了一个滚动的进度条,有个进度条,是可以知道系统并没有死掉仍在运行,但滚动条滚动的速度太快,用户感觉过了很长很长时间数据才出来;
最后修改了一下滚动条动画,将滚动速度调慢,10秒种的时间滚动条只滚动了两次,数据处理的时间没有变化,但心理上感觉似乎比以前快了很多。
【使用缓存技术】
对于经常操作的数据库数据,需要添加查询缓存。可在查询时将查询结果放入缓存,在增删改数据时清空缓存。在ibatis、hibernate等orm框架中都支持缓存,另外OSCache这样的缓存框架也提供了更多的功能。
【SQL优化】
我的感觉,如果有好的SQL编写形成,一般是用不到SQL优化的。但有时候一个不好的SQL,优化后可能会得到性能质的提升。
【设计产品操作方式】
在产品设计时也要考虑性能的问题,通过分页、将数据分步骤展示等方式,防止将大量的数据直接展现。
相关文章推荐
- 系统设计时关于性能问题处理的几点心得
- 关于系统设计的一点小心得
- 关于myeclipse WEB项目使用javabean方式整合jasperReport,Ireport设计模板,Linux错误处理,几天的研究心得
- 对于分布式数据处理系统的性能问题
- 关于RabbitMQ性能问题的几点分析
- 关于安卓3.0以上的系统屏幕适配问题的一些心得
- 关于系统处理能力问题(Observing Processor Queue
- 关于嵌入式系统(特别是UCOSII)网卡驱动编写的几点心得!
- 关于rtsp客户端接收数据、解码、处理性能的有关问题
- Android开发设计模式之——单例模式关于线程不安全问题处理
- Gearman分布式任务处理系统(七)问题研究与性能优化
- 处理【关于sql server 2008 表设计无法保存】的问题
- Gearman分布式任务处理系统(七)问题研究与性能优化
- 今日随想——关于企业级应用中分布式架构设计中系统通讯问题
- 关于基于DDD+Event Sourcing设计的模型如何处理模型重构的问题的思考
- 关于系统处理能力问题(Observing Processor Queue)
- 架构设计分享一:关于分布式系统的数据一致性问题(一)
- 越深入java 就觉得java做得越烂,java设计问题 之 :关于1.5,1.6 java处理基本对象类型cache的问题
- 关于近期HBase系统设计开发和性能调优的一些小结
- 企业级系统架构设计技术与互联网应用技术结合主题一 大规模并发性能问题探讨