優化服務器性能,從后往前說歸根結底不外乎以前幾種情況:
- 優化數據庫
- 優化代碼
- 使用靜態數據
下面就分別做下介紹。
一、數據庫優化
- 盡可能的使用SP,而不是讓sql語句裸奔;
- 表結構設計要合理,起碼要遵守三范式;
數據庫設計三范式: 第一范式:原子性。表中不能套表 第二范式:有主鍵 第三范式:引用通過主鍵.
- 合理地設計索引,正確地使用索引;
- 對於超極大表(千萬級別)最好采用分區表的方式存放,Oralce、SqlServer和Mysql都支持。
二、業務代碼優化
- 減少數據庫往返,
數據庫連接是很重要且寶貴的資源,盡量避免沒調用一次方法就讀取一次數據庫的情況,別小看這一條,我在項目就看到有同事在一個for循環中都次讀取數據庫。
尤其避免綁定的時候都次執行存儲過程; - 合理正確的使用緩存,通過全局變量來保存一些設定,或是頁面級緩存、站點級別緩存來減少服務器壓力;
如果是大內存服務器,我見過最大96G內存的服務器,可以把一些重要數據放在內存中,利用Nosql做成內存緩存,當然這是另一個話題了; - 多用Ajax和客戶端js、html代碼,少用服務器控件,減少刷新和生成冗余的viewstate;
- 采用好的數據結構和算法;
哈系類性能最好,查找的復雜度是O(1),例如Dictionary<K,V>
二叉樹查找復雜度O(logn),排序O(n*logn),List和ArrayList自帶的排序速度接近O(n*logn),
數組類的線性查找O(n),如果你用冒泡排序O(n*n),那么你不是優秀的程序員。
StringBuilder 性能好於 string+=,不過提升的有限,不是本質的數量級別的提升。 - 及時關閉非托管資源;
除了上面提到的數據庫connection,文件IO等也要注意。
三、使用靜態數據
- 使用靜態數據也很重要,可以提升速度2個數量級(百倍),例如門戶網站、大型網站的首頁,引用由特定服務生成的靜態數據(js、txt、html等)速度會很快;
- 圖片、文件、數據服務器分流,可以提升1個數量級(十倍)
web服務器1台或多台;
圖片服務器1台或多台;
文件服務器1台或多台;
數據庫服務器1台或多台; - CDN