數據庫的性能優化

1、性能測試相關術語介紹。算法

        1.響應時間。sql

        客戶端顯示時間,如何將服務器傳過來的頁面儘快顯示到瀏覽器上,是開發 人員須要考慮的問題,這裏面涉及算法優化等問題。這也是開發人員容易忽視的地方。數據庫

        2.吞吐量瀏覽器

        是指單位時間內流經被測系統的數據流量,通常單位爲b/s,即每秒鐘流經的字節數。服務器

        吞吐量和不少相關的因素有關,好比服務器的硬件配置,網絡的拓撲結構,軟件的技術架構等。相對於對電子商務網站來講要求比較高。網絡

        3.併發架構

        併發,是指多個同時發生的操做。併發

        須要注意的是,併發和並行不是一個概念,併發是同時發生,並行是同步運行。數據庫設計

        4.穩定性測試函數

        也叫可靠性測試,是指連續被測系統,檢查系統運行時的穩定程度。

        5.負載測試

        一般是指讓被測系統在其能忍受的壓力的極限範圍以內連續運行,來測試系統的穩定性。假如如今的併發用戶數爲20,咱們就用這20個用戶同時屢次重複登入,直到系統出現故障爲止。負載測試爲咱們測試系統在臨界狀態下運行是否穩定提供一種方法。

        6.壓力測試

        一般指接二連三的給被測系統增長壓力,直到將被測系統壓垮爲止,用來測試系統所能承受的最大壓力。好比咱們不斷增長併發的登入用戶數,直到崩潰。

        以上爲相關術語的介紹。

2、建立數據庫時的優化

        1.建表

        通常把主鍵ID設置爲自動增加,方便查詢,同時ID爲int類型。同時會加上建立時間和刪除事件。

        2.總結

        檢查ER中各個表之間的關係是否合理。

        檢查每一個數據表的字段類型和長度,看是否影響性能的地方。

        檢查觸發器和存儲過程所對應的SQL語句,是否有須要改進的地方,以提升執行效率。

        索引設計是否合理。

3、數據庫對象級別的優化

        包括如下方面:數據庫範式設計的優化,數據表設計的優化,索引設計的優化,以及sql語句的優化。

        1.範式設計的優化

        遵照範式的規則,  數據庫設計時會產生較少的列和更多的表,於是也就減小了數據冗餘,但同時表關係也變得複雜起來,查詢某一條記錄時,每每須要合併多個表來處理,這樣會下降系統性能。      

        如何平衡呢?這就須要咱們對設計的系統很是熟悉,清楚地知道哪些數據是要被常常訪問和重複查詢的,而哪些數據只是偶爾會被操做,對於常常被查詢和操做的數據所在的數據庫,能夠適當的放寬範式設計的標準。

        設計過程以下:1).若是真的須要在兩個表之間,使用第三範式,那麼咱們就要在這兩個表之間創建一個關聯表。好比學生和課程,一個學生對應多個課程,一個成績對應多個課程。若是須要知道成績,即須要學號,也須要課程。這樣的話能夠建立一個存儲過程完成上述要求,並在空閒的時候加以執行。

        2).將經常使用的計算字段(好比求和,求平均值)放入數據表中。

        3).將一個數據表拆分紅兩個部分。這裏面的是拆分又包括了拆分列和拆分行。拆分列指的是若是是一個數據表中的字段是有一部分會被頻繁使用,而另外一部分基本不會被使用,則能夠考慮按照使用頻率將該數據庫拆分紅兩個表。拆分行指的是若是一個數據表中的一部分記錄會被頻繁使用,而另外一部分記錄卻不多被使用,則能夠拆分兩個表。

        2.表設計的優化選擇

        1).除非必要,避免使用容許null值的列和可變長度的列,處理null值會帶來額外的開銷。

        2).視圖的處理速度並非很快,若是能在程序中直接實現視圖的功能最好。

        3).視圖只是邏輯結構,一般使用視圖時要過濾某些固定的數據;固然,使用視圖時要考慮效率,若是兩個大表關聯,那查詢速度是很慢的,使用臨時表。

        4).字段的長度夠用就好,不要浪費空間。

        5).若是開發的系統是單一語言的,就不須要Unicode的數據類型。

        6).外鍵約束的處理速度比觸發器要快的多。

        7).避免使用text類型的字段。

        8).正確的使用索引。

        9).對於日期類型來講,使用smalldatetime類型就能夠了。

        3.索引的優化選擇

        索引主要分爲聚簇索引(也稱爲聚類索引)和非聚簇索引,一個數據表只能有一個聚簇索引,能夠有多個非聚簇索引。合理的使用索引能夠大大提升數據的查詢速度,是優化數據表查詢性能的最經常使用途徑之一。可是在添加聚簇索引的時候必定要考察目標數據表的特色,由於它會下降數據的插入和更新速度,若是數據表中的數據會頻繁的更新的話,建議不要使用。

        如何使用聚簇索引和非聚簇索引呢?        

兩種索引使用的時機

目標列 聚簇索引 非聚簇索引
常常被分組排序 應該使用 可使用
含有小數目的不一樣值 應該使用 不該使用
含有大數目的不一樣值 不該使用 應該使用
極少有不一樣值比,如性別 不該使用 不該使用
頻繁更新的列 不該使用 應該使用

 

注意:認爲就應該在主鍵建立聚簇索引,雖然字段ID比較適合作主鍵(惟一性),但因爲其含有大數目的不一樣值,並不適合用聚簇索引。咱們應用聚簇索引的方法就是看哪個字段在查詢條件中應用的最爲頻繁。好比用戶ID主鍵,就能夠創建一個。

        最好選擇查詢條件中的使用最頻繁的字段做爲前導列,放在複合索引的最前面。對於多個字段一塊兒頻繁出現的狀況可使用複合索引,而且將使用最頻繁的查詢條件做爲複合索引的前導列。

        4.SQL語句級別的優化

        數據的原則:

        1).使用select語句查詢時,儘可能不要使用select * 語句,而是應該指明具體要查詢的字段,提取的字段數量越少,查詢的速度越快。

        2).使用order by語句排序時,最好按照聚簇索引的字段排序,這樣會大大提升排序的速度。

        3).儘可能不要使用or 關鍵字,或是in(),不然會引發全表掃描,大大下降數據的檢索速度。

        4).對笛卡爾積、遊標、循環要謹慎使用。

        5).存儲過程、函數、包、觸發器等儘可能不要超過1000行,之間調用不要複雜。

        6).order by 、group by、distinct這些語句運行時相對來講會佔用較大內存,使用需加以注意。

        7).檢查嵌套、遞歸、子查詢,最好不要超過3層。

        8).儘可能少用not,包括not in和 not exist。

        9).between 1 and 10 要比 in(1,10)的執行效率高。

        10).數值類型的字段要比字符串類型的字段執行效率高。

        11).當where語句後有多個查詢條件時,應該將數據量大的表查詢過濾條件放在前面。

        12).like語句是很耗時間的,若是容許的話,可使用功能相同的語句代替。

        13).儘可能不要在sql語句中進行對列的操做,包括數據庫函數,計算表達式等,不然會致使表掃描。要儘量將操做移至等號右邊。好比應該寫成這樣: select * from user where score >10*10。

相關文章
相關標籤/搜索