1. 程式人生 > >提高效能的資料庫縱向分割和橫向分割

提高效能的資料庫縱向分割和橫向分割

1、縱向分割(列分割)

現象:通常,隨著開發過程的推進,系統中主表的欄位數會越來越多。但是一個表的欄位個數,是受資料庫規範和效能限制的。例如,SQL Server資料庫中一個表最多可以包含1024個欄位,而實際應用中一般不能超過246個欄位,每行資料可以儲存8060位元組,另外,對於大資料表來說,列的數量直接影響存取速度。資料的儲存結構對行的存取更加優化,而不是列的存取。下面,提出幾種分割儲存列的情形。

案例1:

對於一個部落格系統,文章標題,作者,分類,建立時間等,是變化頻率慢,查詢次數多,而且最好有很好的實時性的資料,我們把它叫做冷資料。而部落格的瀏覽量,回覆數等,類似的統計資訊,或者別的變化頻率比較高的資料,我們把它叫做活躍資料。所以,在進行資料庫結構設計的時候,就應該考慮分表,首先是縱向分表的處理。

2、橫向分割(行分割)

現象:對於記錄行數巨大的表來說,最好的辦法是按分類進行行分割,讓資料儲存在多個表內。自然界有一個放之四海皆準的“二八”定律,把它應用到資料上,就可以這樣解釋:在所有的資料中有20%的資料是可以滿足我們80%的需求的。“

根據這個原理,通常有兩種分類方法:

1)  按時間分類
如果資料的時效性很強,我們可以認為所有資料中,20%近期更新的資料能夠滿足業務80%的需求。例如,如果我們有5年的歷史資料,那麼就可以認為
其中在1年內(20%)更新過的資料(也可以是1年內建立的資料),能滿足80%的業務需求;所以我們可以把這張表拆成兩個表,分別儲存20%和80%的
資料,以達到提高效率的目的。如果兩張表仍然沒有有效的提高效能,還可以利用“二八”定律再次分割。
2) 按索引分類
當資料的時效性不明顯時,可以按索引分類資料。所謂索引可以是任何可以用於分類的欄位,比如部門編號,員工編號,工藝編號等等。我們可以這樣假設,

表中儲存了所有零件的資訊,但是在80%的情況下,1號生產車間只會存取自己部門用到的零件。於是,我們可以按照部門編號,把表分成多個。  

案例2:同上面的例子,部落格系統。當部落格的量達到很大時候,就應該採取橫向分割來降低每個單表的壓力,來提升效能。例如部落格的冷資料表,假如分為100個表,當同時有100萬個使用者在瀏覽時,如果是單表的話,會進行100萬次請求,而現在分表後,就可能是每個表進行1萬個資料的請求(因為,不可能絕對的平均,只是假設),這樣壓力就降低了很多很多。

3、資料庫例項分割
一般情況下,開發人員習慣於給每個專案配置一個數據庫。但是實際上我們可以給一個應用程式更多的資料庫例項。比如,在一個網路遊戲伺服器中,經常會
有賬戶資料庫(用於認證)、儲存資料庫(用於儲存狀態)、日誌資料庫(用於儲存監控狀態)、地圖資料庫(用於儲存地圖狀態)等等。類比到ERP系統中,我們可以把許多專案共同的部分抽象出來,分別儲存在不同的資料庫例項中。例如,使用者資訊、部門資訊、系統日誌資訊等可以定製成通用的資料庫,每個軟體專案都可以去使用。
4、資料庫例項物理部署的分割
表分割、資料庫例項的分割,為物理部署帶來了靈活性。例如,我們對物料表按照不同的品目,進行了表分割;又對這些表部署在了不同的資料庫例項中;這樣我們就有條件把這些資料庫例項分別部署在不同的物理資料庫伺服器上。這種部署給我們帶來的好處是,物料計算時,我們可以指令所有的資料庫伺服器分散式計算,大大提高運算速度。