網絡前端,應用服務器,數據庫SQL等性能優化總結

2018年9月11日16:51:42 发表评论 4 閱讀

對於web應用開發,多數性能瓶頸均出現在資料庫上,除了採用分散式架構或雲處理(大公司基本上都是),更重要的是平時程式設計時要遵照一些規則,從根本上提高系統的性能,以下總結了一些常用的規則方法,僅供參考,歡迎跟帖補充。。。

1、 把資料、日誌、索引放到不同的I/O設備上,增加讀取速度。資料量(尺寸)越大,提高I/O越重要。

2、 縱向、橫向分割表,減少表的尺寸,如:可以把大資料量的欄位拆分表。

3、 根據查詢準則,建立索引,優化索引、優化訪問方式,限制結果集的資料量。注意填充因數要適當(最好是使用預設值0)。索引應該儘量小,儘量使用位元組數小的列建索引,不要對有限的幾個值的列建單一索引。

4、 用OR的字句可以分解成多個查詢,並且通過UNION連結多個查詢。它們的速度只與是否使用索引有關,如果查詢需要用到聯合索引,用UNION all執行的效率更高。

5、 在查詢SELECT語句中用WHERE子句限制返回的行數,避免資料表掃描。如果返回不必要的資料,則浪費了伺服器的I/O資源,加重了網路的負擔,降低了性能。如果表很大,在資料表掃描期間將表鎖住,禁止其他的聯結訪問表,後果很嚴重。

6、 注意使用DISTINCT,在沒有必要時不要用,它同UNION一樣會使查詢變慢。

7、 在IN後面值的列表中,將出現最頻繁的值放在最前面,出現最少的放在最後面,減少判斷的次數。

8、 一般在GROUP BY和HAVING子句之前就能剔除多餘的行,所以儘量不要用它們來做剔除行的工作,也就是說盡可能在WHERE中過濾資料。

9、 儘量將資料的處理工作放在伺服器上,減少網路的開銷,如使用存儲過程。存儲過程是編譯、優化過,並且被組織到一個執行規劃裡,且存儲在資料庫中的SQL語句(存儲過程是資料庫伺服器端的一段程式),是控制流語言的集合,速度當然快。

10、 不要在一句話裡再三地使用相同的函數,浪費資源,將結果放在變數裡再調用更快。

11、 針對大量唯讀查詢操作進行優化的方法

網絡前端,應用服務器,數據庫SQL等性能優化總結

web前端性能優化

Web前端指網站業務邏輯之前的部分,包括:

1.流覽器載入

2.網站視圖模型

3.圖片服務

4.CDN服務等

主要優化手段有優化流覽器訪問,使用反向代理,CDN等。

1.流覽器訪問優化

(1)減少http請求

HTTP協定是無狀態的應用層協定,意味著每次HTTP請求都需要簡歷通信鏈路,進行資料傳輸,而在伺服器端,每個HTTP都需要啟動獨立的執行緒去處理,這些通信和服務的開銷都很昂貴,減少HTTP請求的數目可有效提高訪問性能。

減少HTTP請求的主要手段是:

合併CSS,以及壓縮CSS大小合併JavaScript,以及壓縮JS大小合併圖片將流覽器一次訪問需要的JavaScript,CSS合併成一個檔,這樣流覽器就只需要一次請求。多張圖片合併成一張,如果每張圖片都有不同的超連結,可通過CSS偏移回應滑鼠點擊操作,構造不同的URL。

(2)使用流覽器緩存

對一個網站而言,CSS,JavaScript,Logo,圖示等這些靜態資源檔更新的頻率都比較低,而這些檔又幾乎是每次HTTP請求都需要的,如果將這些檔緩存在流覽器中,可以極好地改善性能。通過設置HTTP頭中Cache-Control和Expires屬性,可設定流覽器緩存,緩存時間可以是數天甚至是幾個月。有時候,靜態資源檔變化需要及時應用到用戶端流覽器,這種情況可以通過改變檔案名實現,比如一般會在JavaScript後面加上一個版本號,使流覽器刷新修改的檔。

(3)啟用壓縮

在伺服器端對檔進行壓縮,在流覽器端對檔解壓縮,可有效較少通信傳輸的資料量。文字檔的壓縮效率科大80%以上。

(4)CSS放在頁面最上面,JavaScript放在頁面最下面

流覽器會在下載完全部CSS之後對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓流覽器儘快下載CSS。JS則想法,流覽器在載入JS後立即執行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此JS最好放在頁面最下面。

(5)減少Cookie傳輸

一方面,Cookie包含在每次請求和回應中,太大的Cookie會嚴重影響資料傳輸,因此哪些資料需要寫入Cookie需要慎重考慮,儘量減少Cookie中傳輸的資料量。另一方面,對於某些靜態資源的訪問,如CSS,JS等,發送Cookie沒有意義,可以考慮靜態資源使用獨立功能變數名稱訪問,避免請求靜態資源時發送Cookie,減少Cookie傳輸的次數。

2.CDN加速

CDN(Content Distribute Network,記憶體分發網路)的本質上仍然是一個緩存,而且將資料緩存在離使用者最近的地方,是使用者以最快速度獲取資料,即所謂網路訪問第一跳。

CDN一般緩存的是靜態資源,如圖片,檔,CSS,Script腳本,靜態網頁等,但是這些檔訪問頻率很高,將其緩存在CDN可極大改善網頁的打開速度。

3.反向代理

傳統代理伺服器位於流覽器一側,代理流覽器將HTTP請求發送到互聯網上,而反向代理伺服器位於網站機房一側,代理網站Web伺服器接收HTTP請求。和傳統代理伺服器可以保護流覽器安全一樣,反向代理伺服器也具有保護網站安全的作用,來自互聯網的訪問請求必須經過代理伺服器,相當於在Web伺服器和可能的網路攻擊之間建立了一個屏障。

除了安全功能,代理伺服器也可以通過配置緩存功能加速Web請求,當使用者第一次訪問靜態內容的時候,靜態內容就被緩存在反向代理伺服器上,這樣當其他使用者訪問該靜態內容的時候,就可以直接從反向代理伺服器返回,加速Web請求回應速度,減輕伺服器負載要。

應用伺服器性能優化

應用伺服器就是處理網站業務的伺服器,網站的業務代碼都部署在這裡,是網站開發最複雜,變化最多的地方,優化手段主要有緩存、集群和非同步等。

網站性能優化第一定律:優先考慮使用緩存優化性能。

緩存的本質是一個記憶體Hash表,網站應用中,資料緩存以一對Key,Value的形式存儲在記憶體Hash表中。緩存主要用來存放那些讀寫比很高、很少變化的資料。

二八定律:80%的訪問落在20%的資料上

使用緩存需要注意的問題:

把頻繁修改的資料放入緩存。容易出現資料寫入緩存後,應用還來不及讀取緩存,資料就已經失效的情形,徒增系統負擔。一般來說,資料的讀寫比在2:1以上,緩存才有意義。沒有熱點的訪問。 緩存使用的記憶體資源非常寶貴,只能將最新訪問的資料緩存起來,而把歷史資料清理出緩存。即緩存資源應該留給20%的熱點資料。資料不一致與髒讀。 一般會對緩存設置失效時間,超過失效時間,就要從資料庫重新載入。因此應用要忍受一定時間的資料不一致。另一種策略是資料更新時立即更新緩存,不過這也會帶來更多的系統開銷和事務一致性的問題。緩存可用性。 業務發展到一定階段時,緩存會承擔大部分數據訪問的壓力,資料庫已經習慣了有緩存的日子,所以當緩存伺服器崩潰時,資料庫會因為完全不能承受如此大的壓力而宕機,進而導致整個網站不可用。這種情況被稱作緩存雪崩,發生這種故障,甚至不能簡單地重啟緩存伺服器和資料庫伺服器來恢復網站訪問。 解決方式:1、緩存熱備(當某台伺服器宕機時,將緩存訪問切換到熱備伺服器上。);2、緩存伺服器集群緩存預熱。 緩存中存放的是熱點資料,熱點資料是緩存系統用LRU對不斷訪問的資料篩選出來的,這個過程需要較長的時間。新啟動的緩存系統沒有任何資料,此時系統的性能和資料庫負載都不太好。因此可以選擇在啟動緩存是就把熱點資料預載入好。緩存穿透。 因為不恰當的業務或惡意攻擊,持續高併發地訪問某一個不存在的資料,如果緩存不保存該資料,就會有大量的請求壓力落在資料庫上。簡單的解決方式是把請求的不存在的資料也放進緩存,其value是null。對應可以考慮的分散式緩存有memcached、redis,降低對資料庫的讀操作。

資料庫SQL性能優化

最後就是考慮資料庫端的性能優化,如果訪問量巨大,除了sql優化外,還會涉及到分庫分表、讀寫分離、利用資料庫中介軟體來解決(下面架構師系列有講),這裡就不再重複。

1.對查詢進行優化,要儘量避免全資料表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全資料表掃描,如:

select id from t where num is null3.應儘量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全資料表掃描。

hcyaobin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: