系統設計時關于性能問題處理的幾點心得
【將復雜的運算分解到其它過程】
此種思想將整個系統的操作看成一個整體,類似于負載均衡。在系統中常見的一個問題是,數據量比較大,對數據的查詢統計變得很復雜很緩慢。對于這種問題應該在設計時就進行考慮,建立表的冗余字段或者匯總表存儲一些匯總信息,在錄入或更新數據時計算冗余字段或匯總表的值。這樣將復雜的運算時間分解到了數據錄入修改的時間。而一般的錄入/修改都是單筆的操作,此時的一點點延時(可能很少很少)對用戶的體驗是沒有什么影響的,而進行查詢統計時變成了直接查詢表,也會變得很快。
【將多次查詢簡化為一次查詢】
將多次查詢簡化為一次查詢,可以減少數據庫連接的性能消耗。對于此種思路,我認為可以有三種實現:
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