MySQL(十六)------ 優化數據庫對象

        在數據庫設計時,通常會有很多問題需要思考,比如是否需要把所有的表按第三範式來設計?表中各字段設計爲多大的長度合適?等等這些問題都是需要考慮的;下面介紹的就是通過一些方法來分析,而後進行指導數據庫的優化。

一、優化表的數據類型及長度

       表字段的類型需要根據應用來判斷,字段的長度要留有一定的冗餘,但不能有大量冗餘,具體怎麼定可以通過MySQL的函數 procrdure analyse() 對當前應用的表進行分析,分析顯示的結果會對數據類型及長度提出優化建議,然後根據實際情況決定是否使用該種優化。

select * from tbl_name PROCEDURE ANALYSE();  對錶的每一列進行優化分析
select * from tbl_name PROCEDURE ANALYSE(16,256);    不要爲那些包含的值多餘16個或者256個字節的ENUM類型提出建議(因爲數據太長輸出的信息很長難以閱讀)

         具體的實例我這裏就偷個懶暫時不貼出來,大概過程我簡單說一下:比如你現在有一張表有很多的不同類型的字段,各字段的長度也不相同,當使用PROCEDURE ANALYSE() 進行分析後,對於每一個列字段都會給出一個分析結果,你可以根據結果中對於該列的最大值、最小值、最大長度、最小長度、平均長度、優化建議等信息綜合判斷出一個大概的結果,比如字段的最大長度也才2,那你的字段長度設置在3比較合理;當然也還要根據實際情況,比如該字段存在突增的情況但目前還沒有顯示,此時你就要留意這樣問題。確定好優化方式後,通過修改表結構對字段類型進行修改即可。

二、通過表的拆分提高表的訪問效率

       對於MyISAM類型的表有兩種拆分方法:

1. 垂直拆分

      把主碼和一些列放到一個表,然後把主碼和另外的列放到另一個表中。如果表中某些列常用而另一些列不常用則可以採用垂直拆分;這種方法使得數據行變小,一個數據頁就能存放更多的數據,在查詢時會較少IO的次數;缺點就是需要管理冗餘列,當要查詢所有數據時需要聯合(JOIN)操作。

2. 水平拆分

      根據一列或多列數據的值把數據行放到兩個獨立的表中。水平拆分通常在以下幾種情況下使用:

  • 表很大,分割後可以降低在查詢時需要讀取的數據和索引的頁數,同時也降低了索引的層數;
  • 表中的數據本來就有獨立性,例如各個地區的數據,不同時期的數據;特別是有些數據常用而另外一些不常用;
  • 需要把數據存放到多個介質上;

       水平拆分會給應用增加複雜度,因爲在查詢時需要多個表名,而且查詢所有的數據需要UNION操作。有時候這種分錶帶來的複雜性會超過它帶來的優點;因此,水平拆分要考慮數據量的增長速度,再根據實際情況決定是否拆分。

三、逆規範化

        數據庫設計時需要滿足規範化這個都清楚,但是規範化帶來的問題各種關係增多,導致表之間的連接操作頻繁,而這種連接操作是性能較低的操作,因此,有時候使用逆規範化的方法往往有奇效。

       在使用反規範化操作之前一定要權衡利弊,要充分考慮數據的存取需求、常用表的大小、一些特殊的計算(例如合計)、數據的物理存儲位置等。常用的反規範技術有以下幾種:

  • 增加冗餘列:在多個表中具有相同的列,它常用來在查詢時避免連接操作;
  • 增加派生列:增加的列來自其它表中的數據,有其它表中的數據經過計算生成。增加的派生列其作用是在查詢時減少連接操作,避免使用集函數;
  • 重新組表:如果許多用戶需要查看兩個表連接出來的結果數據,則把這兩個表組成一個表來減少連接提高性能;
  • 分割表:查看上面的介紹;

    當然,使用逆規範化的技術需要保持數據的完整性,因此需要一定的管理來實現,常用的方法有批處理維護,應用邏輯和觸發器。

  • 批處理維護是指對複製列或者派生列的修改積累一定的時間後,運行一批處理作業或儲存過程對複製或派生列進行修改,這只能在實時性要求不高的情況下使用;
  • 數據的完整性也可由相應的邏輯實現,這就要求必須在同一事務中對所有涉及的表進行增、刪、改操作。用應用邏輯來實現數據的完整性風險較大,因爲同一邏輯必須在所有的應用上使用和維護,容易遺漏,特別是在需求變化時不易於維護;
  • 使用觸發器,對數據的任何修改立即觸發對複製列或派生列的相應修改;觸發器是實時的,而且相應的處理邏輯只在一個地方實現,易於維護;一般來說觸發器是解決這類問題最好的辦法。

四、使用中間表提高統計查詢速度

       對於數據量很大的表在上面進行統計查詢等操作時往往效率很低,並且還要考慮這些操作是否會對在線應用產生負面影響;因此,往往這種時候會使用中間表來獨立完成這些操作會好很多。

       這裏舉個例子,比如某個公司積累了大量用戶,每時每刻這些用戶的消費記錄都被記在公司的消費記錄表上,現在有個需求,需要統計一下上週用戶的消費總額以及各不同時間段的消費總額。

       遇到這樣的問題如果不使用中間表的話需要對原表進行條件篩選查詢並進行統計,可想而知這麼大體量的數據表這種操作很費時間,而且最重要的一點就是由於是直接對生產表進行操作,因此一旦出現一點錯誤將直接影響到線上生產,產生的後果將非常大;故而在這種情況下爲了安全、爲了效率往往使用中間表來完成(這就像平時我們修改東西的時候會建一個副本一樣)。可以創建一個表結構與原表一模一樣的中間表,然後近一週的數據插入到該表中,隨後對該臨時表進行統計查詢。

        中間表在統計查詢時經常會用到,其優點如下:

  • 中間表複製源表的部分數據,與源表相互隔離,對中間表進行的相關操作不會影響到線上生產;
  • 中間表上可以靈活的添加索引或增加輔助字段,從而達到提高統計查詢效率和輔助查詢的作用;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章