1. 程式人生 > >提高系統性能資料庫設計的橫向分割和縱向分割技術

提高系統性能資料庫設計的橫向分割和縱向分割技術

本文介紹一些關於提高系統性能方面的知識,列分割,行分割,例項分割,物理儲存分割等技術。

這篇主要講解一下資料庫的設計,因為一個好的資料結構,對整體系統的運作太重要了,請看看本文的內容。

提到程式效能,大家都知道時間複雜度的公式O(f(n))。在提高效能的這個迷局中,很多人都會想盡辦法降低演算法函式f的複雜度,或者是提高函式f的執行 速度。但是這些都是沒有辦法的辦法,是捨本求末的辦法。如果基數n巨大,這類方法都不會有很好的效果,因為問題的本身在於基數 n。千方百計減少基數n的數量才能獲取質的提高。

如何才能達到降低基數n的效果呢?假設你一個雜貨店的老闆,你有一個雜誌貨櫃。可是雜誌的種類越來越多,貨櫃放不下了,這時你會怎麼做?是延長貨櫃的長度 還是把雜誌分類後,再增加一個貨櫃?我更願意增加一個貨櫃,而不是無限制的延長原來的貨櫃。從雜貨店貨櫃的啟示,我覺得降低基數 n的數量的有效辦法是分而治之:

一、 列分割

通常,隨著開發過程的推進,系統中主表的欄位數會越來越多。但是一個表的欄位個數,是受資料庫規範和效能限制的。例如,SQL Server 資料庫中一個表最多可以包含1024個欄位,而實際應用中一般不能超過246個欄位,每行資料可以儲存8060位元組。(參見 http://msdn.microsoft.com/zh-cn/library/ms143432.aspx)

另外,對於大資料表來說,列的數量直接影響存取速度。資料的儲存結構對行的存取更加優化,而不是列的存取。下面,提出幾種分割儲存列的情形。

1、  列數太多時。

我在2004年曾經做過一個失敗的專案。在設計一個5年的採購計劃表時,我把每個月的採購計劃設計成列,這樣表的列說增加了60 列,這張表最終達到120個列。這種設計導致的結果是,當表有100萬條記錄時,採購計劃的計算要花費2.5小時。改進方案是把列改成行儲存,增加一個計 劃年份欄位,這樣,總的列數減少了近40%,表的行數增加了增加到了500萬條,但是存取速度提高了很多,使採購計劃的計算時間降低到0.5小時。

所以,我給出的意見是

l         表的列數最好不要超過80個

l         行儲存比列儲存的存取速度更快

2、  表中列的資料相對較大或不經常用到時

表中存在下面的欄位時需要隔離出去:

l         圖片物件

l         附件(檔案等)

l         大量的備註資訊

l         幾乎不被查詢的列

3、  表中的欄位,可以按照業務邏輯分類時。

按照資料庫的設計規範,一個同一個物件的屬性應該屬於一張表。可是,實際情況是,如果按照業務邏輯來劃分表,能獲得更好的效能。

二、行分割

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

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

1、  按時間分類

如果資料的時效性很強,我們可以認為所有資料中,20%近期更新的資料能夠滿足業務80%的需求。例如,如果我們有5年的歷史資料,那麼就可以認為 其中在1年內(20%)更新過的資料(也可以是1年內建立的資料),能滿足80%的業務需求;所以我們可以把這張表拆成兩個表,分別儲存20%和80%的 資料,以達到提高效率的目的。如果兩張表仍然沒有有效的提高效能,還可以利用“二八”定律再次分割。

實效性資料量和使用量關係:

2、  按索引分類

當資料的時效性不明顯時,可以按索引分類資料。所謂索引可以是任何可以用於分類的欄位,比如部門編號,員工編號,工藝編號等等。我們可以這樣假設, 表中儲存了所有零件的資訊,但是在80%的情況下,1號生產車間只會存取自己部門用到的零件。於是,我們可以按照部門編號,把表分成多個。  

三、資料庫例項分割

一般情況下,開發人員習慣於給每個專案配置一個數據庫。但是實際上我們可以給一個應用程式更多的資料庫例項。比如,在一個網路遊戲伺服器中,經常會 有賬戶資料庫(用於認證)、儲存資料庫(用於儲存狀態)、日誌資料庫(用於儲存監控狀態)、地圖資料庫(用於儲存地圖狀態)等等。類比到ERP系統中,我 們可以把許多專案共同的部分抽象出來,分別儲存在不同的資料庫例項中。例如,使用者資訊、部門資訊、系統日誌資訊等可以定製成通用的資料庫,每個軟體專案都 可以去使用。

四、資料庫例項物理部署的分割

表分割、資料庫例項的分割,為物理部署帶來了靈活性。例如,我們對物料表按照不同的品目,進行了表分割;又對這些表部署在了不同的資料庫例項中;這 樣我們就有條件把這些資料庫例項分別部署在不同的物理資料庫伺服器上。這種部署給我們帶來的好處是,物料計算時,我們可以指令所有的資料庫伺服器分散式計 算,大大提高運算速度。

相關推薦

提高系統性資料庫設計橫向分割縱向分割技術

本文介紹一些關於提高系統性能方面的知識,列分割,行分割,例項分割,物理儲存分割等技術。 這篇主要講解一下資料庫的設計,因為一個好的資料結構,對整體系統的運作太重要了,請看看本文的內容。 提到程式效能,大家都知道時間複雜度的公式O(f(n))。在提高效能的這個迷局中,很多人都會

避免雲中斷提高系統性的4種方法

互聯網 擴展 軟件 提高 價格 route 變化 四種方法 數據   避免雲中斷和提高系統性能的4種方法   當大多數人聽到關於雲計算中斷的頭條新聞時,他們通常考慮的是哪個雲計算供應商,或其負面宣傳將如何影響股票價格,卻很少有人會想到事件背後的相關人員,也就是負責修復問題並

提高系統性的2個常用手段---快取非同步

快取 1、快取重新整理機制,快取重新整理是指什麼時候把資料庫中的資料載入到快取  (1) 定期重新整理;  (2) 快取命中失敗時重新整理;  2、在有快取時的資料寫入方式 (1)同步寫入 即快取和資料庫同時被寫入,即在應用層進行雙寫操作,這種方式可以有效保證快取和

使用redis減小數據庫訪問壓力及提高系統性

基礎上 磁盤 log 配置 關系 mas strong 小項目 內存 什麽是redis   redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(

提高系統性——對SQL語句優化的思考

http art pos select 語句 聯合 data 過程 情況 軟件在研發的過程中自始至終都在留意著系統的可擴展性。但與此同一時候也在關註著系統的性能,SQL語句作為系統性能的一環不容忽視。從今天開始結合開發的經驗,談一下我對SQL語句優化的理

SylixOS使用RAM檔案系統大幅度提高系統性

在某些特定使用場景中可使用RAM檔案系統提高系統性能,解決業務問題。一下已MPC8313作為測試平臺,測試使用RAM和yaffs2檔案系統時,FTP檔案傳輸速率與應用程式載入時間的效能變化。 硬體平臺:MPC8313 base版本:V1.8.0 FTP檔案傳輸樣本:bspmpc8313.elf&

資料庫設計三大正規化五大約束

【三大正規化】 第一正規化(1NF):   資料表中的每一列(欄位),必須是不可拆分的最小單元,也就是確保每一列的原子性。   例如: userInfo: '山東省煙臺市 1318162008' 依照第一正規化必須拆分成        &

[資料庫設計]如何合理有效的進行資料庫設計

前言 通常情況下,可以從兩個方面來判斷資料庫設計的是否規範: 1)一是看看是否擁有大量的窄表 窄表往往對於OLTP比較合適,符合正規化設計原則 2)寬表的數量是否足夠的少。 所謂的寬表就是欄位比較多的表,包含的維度層次比

效能優化(一)Hibernate 利用快取(一級、二級、查詢)提高系統性

      在hibernate中我們最常用的有三類快取,分別為一級快取、二級快取和查詢快取,下面我們對這三個快取在專案中的使用以及優缺點分析一下。       快取它的作用在於提高效能系統性能,介於應用系統與資料庫之間而存在於記憶體或磁碟上的資料。       我們程式設

win7設定提高系統性

/*****************************START*****************************************************/ 1.解除安裝不必要的應用程式 可以在一些軟體管理中心解除安裝,最好到控制面板->解除安裝

資料庫設計的重要性設計原則

說起資料庫設計,相信大家都明白怎麼回事,但說起資料庫設計的重要性,我想大家也只是停留在概念上而已,到底如何重要?怎麼重要呢?今天就將我至今為止的理解向大家闡述下。 一個不良的資料庫設計,必然會造成很多問題,輕則增減欄位,重則系統無法執行。我先來說說資料庫設計不合理的表現吧:

zbb20180919 db 數據庫的水平分割垂直分割

同時 gpo 分開 class 介質 什麽 數據庫應用 cti 減少 數據庫的水平分割和垂直分割 在數據庫操作中,我們常常會聽說這兩個詞語:水平分割和垂直分割。那麽到底什麽是數據庫的水平分割,什麽是數據庫的垂直分割呢?本文我們就來介紹一下這部分內容。 1、水平分割: 按

【計算機視覺必讀乾貨】影象分類、定位、檢測,語義分割例項分割方法梳理

文章來源:新智元 作者:張皓 【導讀】本文作者來自南京大學計算機系機器學習與資料探勘所(LAMDA),本文直觀系統地梳理了深度學習在計算機視覺領域四大基本任務中的應用,包括影象分類、定位、檢測、語義分割和例項分割。 本文旨在介紹深度學習在計算機視覺領域四大基本任務中的應用,包括分類(圖

深度學習 --- CNN的變體在影象分類、影象檢測、目標跟蹤、語義分割例項分割的簡介(附論文連結)

以上就是卷積神經網路的最基礎的知識了,下面我們一起來看看CNN都是用在何處並且如何使用,以及使用原理,本人還沒深入研究他們,等把基礎知識總結完以後開始深入研究這幾個方面,然後整理在寫成部落格,最近的安排是後面把自然語言處理總結一下,強化學習的總結就先往後推一下。再往後是系統的學習一下演算法和資料

一文詳解計算機視覺五大技術:影象分類、物件檢測、目標跟蹤、語義分割例項分割

【 導讀】目前,計算機視覺是深度學習領域最熱門的研究領域之一。計算機視覺實際上是一個跨領域的交叉學科,包括電腦科學(圖形、演算法、理論、系統、體系結構),數學(資訊檢索、機器學習),工程學(機器人、語音、自然語言處理、影象處理),物理學(光學 ),生物學(神經科學)和心理學(認知科學)等等。許

簡訊轟炸之橫向轟炸縱向轟炸

白帽子您好,橫向轟炸不收,故此忽略,感謝提交。如有更多疑問可諮詢平臺客服小姐姐(QQ:3459476393),非常感謝對漏洞盒子與網際網路安全的支援,對此給您帶來的不便我們深感抱歉。 收到上面一條資訊, 才知道簡訊轟炸也分橫向轟炸和縱向轟炸。 從字面上猜猜,大概如下意思。 就我遇到的,目前可被橫向轟炸的簡

Android 橫向滾動縱向滾動的TextView

橫向滾動TextView TextView的橫向滾動,本身自帶的跑馬燈效果+自定義一個簡單的TextView即可實現. 自定義view程式碼如下: public class HorizontalTextview extends TextView {

Facebook人工智慧實驗室提出「全景分割」,實現例項分割語義分割的統一

原文來源:arxiv作者:Alexander Kirillov、Kaiming He1、Ross

轉mysql橫向擴充套件縱向擴充套件

Scale-up(縱向擴充套件)和Scale-out(橫向擴充套件)的解釋   談到系統的可伸縮性,Scale-up(縱向擴充套件)和Scale-out(橫向擴充套件)是兩個常見的術語,對於初學者來說,很容易搞迷糊這兩個概念,這裡總結了一些把概念解釋的比較清楚的內容。