從瀏覽者訪問網頁的流程來看如何提高系統反應速度(2)--服務端網頁的執行

  從瀏覽者訪問網頁的流程來看如何提高系統反應速度(2)--服務端網頁的執行

從瀏覽者訪問網頁的流程來看如何提高系統反應速度(2)--服務端網頁的執行

服務端程序的執行,大體包含以下幾個大步驟:

1、初始化頁面
2、接收並處理傳入的參數
3、生成查詢語句(或調用外部webservice的地址)
4、開始查詢(或開始調用外部webservice)
5、輸出查詢結果
6、清理頁面

在這些步驟中,目前看來對運行速度影響最大的是第3、第4步

所以對頁面的優化就集中在這兩步

首先注意,如果是調用外部的webservice,如果那個webservice反應比較慢,則頁面也會很慢,在調試時要注意設置調用超時,否則頁面很可能會無限期等待,在調試頁面時要特別注意

如果是數據庫查詢,則查詢語句的編寫很有講究,系統的大部分優化工作都在這裏。

如何編寫良好的查詢語句

一個不好的(或者說慢的)查詢,不外乎兩個原因:
1、數據庫做了不必要的計算來得到結果(比如彙總等),對此的建議是儘量讓計算由前臺程序來完成
如果需要把大量數據返回給前臺程序才能完成計算,比如彙總,也可以考慮在數據庫端完成
對於彙總等的計算,最好的建議是儘量在平時就做好彙總並保存好結果,而不要在查詢時再做
2、必定是做了大量的磁盤讀(寫),上一點提到的彙總操作也會導致這個結果
據說一個好的查詢,必須要在200ms內完成
所以數據庫的優化,說到底主要就是減少磁盤的無效io,升級增加硬件只是加速了磁盤io,對消除無效的查詢io沒有用處

實際要做的,就是設計合理的數據庫結構,和建立合適的索引

合理的數據庫結構,是查詢優化的基礎,否則索引再多也沒用(索引也不能太多,一個表的索引最好不要超過10個,否則會影響數據的更新效率)
數據庫的設計一定是爲了將來的查詢,而不能一味的追求所謂的幾個範式,範式的主要目的是消除數據的冗餘,便於數據的更新和統一。而優化的很多步驟,恰恰是要增加冗餘,來減少查詢時的多表關聯,這跟做緩存的目的一樣,都是用空間來換時間

對於單表查詢,只要有合適的索引,查詢一般都沒問題

對於多表關聯查詢,優化的關鍵就是儘量讓條件字段和排序字段集中在一個表中,而不是由幾個表的條件字段組合來決定結果,因爲這樣的話,表和表之間的相關行就要進行連接,而這裏面的很多連接很可能是沒用的,因爲不組合就無法知道是否符合條件(連接的動作也是消耗資源的)。但如果我們把條件字段在關鍵表中做適當冗餘,就可以避免這種大量的連接,這樣在關鍵表上建立合適的索引就基本可以決定查詢結果了,減少了很多無謂的連接,也就減少了磁盤io。如果參與查詢的表是很大的表,這種連接是很消耗資源的。所以在系統運行初期,這種問題不容易發現,因爲數據量太小,這是很多系統優化的關鍵地方。

做到了以上的,下面就開始考慮如何在某個表上建立索引以及如何讓索引發揮作用
常見的索引的類別:
1、聚集索引
2、非聚集索引
3、覆蓋索引
4、索引視圖

聚集索引就是決定表中的記錄在磁盤上按何種順序保存的索引(每個表只能有一個),不同記錄的字段值是可以重複的。主鍵就是聚集索引,但它是一種特殊的聚集索引,因爲主鍵是不允許重複的聚集索引。對聚集索引的查詢其實就是查詢數據表本身

非聚集索引是另外保存的只含有某個數據表的索引相關字段的“表副本”,他的存放順序由建立索引時的字段順序決定,針對某個非聚集索引的查詢並不查詢數據表本身,因爲非聚集索引是另外佔用磁盤空間的。
某個表在有主鍵時,他的非聚集索引的每條記錄跟物理表是通過主鍵來關聯的,所以推薦每個表都建立主鍵

覆蓋索引是一種特殊的非聚集索引,它其實就是針對某個查詢,其所含有的索引字段已經完全包括了返回的字段、條件字段和排序字段,也就是說,只要查詢這個索引,而不用查詢數據表本身就已經可以得到查詢結果了

索引視圖其實就是對視圖建立的索引。視圖本身只是個封裝好的查詢計劃,在實際使用時,每次都是要進行查詢的,而對某個視圖建立了索引,其實就是把該視圖的查詢結果物理存儲到磁盤上了,並且這個結果會隨數據庫的更新而自動更新,一般用於將做彙總統計的視圖物理化,加速查詢。但在建立索引視圖時會有條件限制,且更新時也會消耗數據庫資源,一般不建立

建立索引的一些原則是:
1、不在重複率很高的字段上建立,比如性別字段
2、先是條件字段,然後是排序字段(根據查詢語句的要求合理設置個字段的升降序,如有需要)

如何有效的利用已建立的索引
1、確保索引就是根據查詢語句的條件和排序建立的,並且索引的第一個字段就在查詢語句裏作爲條件字段
2、在查詢語句的條件或排序裏不要出現計算函數等不確定值,最好在平時都先計算好並把計算結果都保存到對應的字段裏
3、不要用not、!、or、<>號等符號
4、在不確定符合條件的記錄數的多少時,不建議用like符號來匹配文本,如果除了like,還有其他明確的條件也可以先限定只返回少量的待篩選的記錄,則在這些少量結果裏可以使用like符號

如何有效的減少無謂的查詢帶來的磁盤讀取
1、不使用select *
2、多用select top n
3、使用set rowcount n開關
4、將查詢拆解,先查符合條件的記錄的主鍵,再根據這少量的主鍵查詢其他相關信息


超級重要的兩個技巧:
1、查詢提示小技巧with (nolock),對絕大部分查詢,在表名字(或別名)後面都可以加上with (nolock)查詢提示來減少阻塞和死鎖(注意這並不是優化了查詢)
2、對於複雜的查詢,可以在查詢語句裏包含這個語句所在功能頁面和函數的註釋語句,便於快速定位瞭解該語句的執行頁面和環境


緩存(靜態化)的建立:
1、對整頁面的緩存
2、對頁面模塊的查詢結果的緩存
緩存注意事項
1、磁盤緩存文件的目錄分佈
2、磁盤讀取速度
3、緩存時間的控制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章