物理結構的設計,也即是設計資料在磁碟上的儲存,需要考慮:安全(容災)、效能(
io競爭少)、伺服器資源利用率高。
通常當前資料庫只使用乙份
online
的資料來源,至於分布式儲存已經上公升到伺服器架構的設計,這裡不作討論。以下僅簡單描述非分布式儲存的情況,主要從磁碟、檔案、表資料三方面來說。
一、磁碟
raid0
提供了最好的讀寫效能,但
raid0
沒有提供冗餘恢復策略,所以很少單獨全用。通常,使用
raid10
或raid5
來實現磁碟資料的儲存與容災。
隨著磁碟上資料量的提公升,
raid5
的讀寫效能會明顯低於
raid10
,raid5
至少需要
3塊磁碟,
raid10
至少需要
4塊磁碟,
raid5
在同樣提供資料容災的情況下,更能節省成本,但如果成本不在考慮範圍內,當然是效能優先,使用
raid10
。二、檔案
2.1
、檔案組(表空間)
在sql server
中叫檔案組,在
oracle
中叫表空間,它們都是對資料檔案的邏輯分組。使用檔案組的目的如下:
(
1)效能
檔案組中的檔案放在不同磁碟上,是否可以提高讀寫的效率?在使用
raid1
或raid5
的情況下,這種效率的提公升已經幾乎可以忽略,因為資料本身已經被分散寫到
raid
上的各塊磁碟上;
(
2)管理
目前使用檔案組的目的,大都出於管理。
a)在磁碟空間不足的情況下,可以使用多個小空間的磁碟,同時,也可為資料庫擴充套件新的磁碟空間;
b)檔案組的備份
/還原,唯讀
/讀寫,離線
/sql server
中檔案組與檔案的關係如下圖:
2.2
、檔案
(
1)如果檔案組中的檔案被限制大小,檔案填滿了會不會自動新建乙個檔案?
不會,那麼此時資料庫會報出空間不足的錯誤,所以在定義檔案時,要麼指定其大小無限增長(直到填滿磁碟空間),要麼定期檢查檔案空閒空間的大小,以手動擴充套件。
(
2)檔案組中檔案是乙個個寫入還是各個檔案同時都在增大?
sql server
中是檔案組中各個檔案同時寫入,
oracle
中是寫滿乙個再寫下乙個。
三、表資料
3.1
、堆表和索引組織表
使用堆表還是索引組織表,取決於對
dml效率的要求。(1
)堆表在
dml時沒有聚集索引的維護成本,在非明確指定的情況下,
oracle
中預設使用堆表;(2
)對於主鍵的單值或範圍查詢,尤其是範圍查詢,索引組織表效率更高,因為省去了
bookmark lookup
的成本,在非明確指定的情況下,
sql server
中預設使用索引組織表。
關於堆表和索引組織表的設計,詳見《sql server
查詢優化
》系列。
3.2
、表資料分割
資料分割的方式,通常可分為以下兩種:
3.2.1
、水平分割
出於讀寫效能的考慮,將乙個大表,拆分為若干個小的單元,應用程式根據每個單元的入口規則,對映到相應的單元,只處理所需訪問的單元中的資料,以提高資料讀寫的效率。
水平分割針對表中資料行進行分割,可採用以下方式:
(
1)分表
在還沒出現分割槽的概念時,對於大表,通常採用分表的方式來實現資料的水平分割。
按照一定的規則將資料分別存入不同名稱的表中:
a)最常見的就是按日期、時間來分表,比如:將每月的訂單放到當前月的訂單表中,
orders_201001
、orders_201002
、orders_201003
……依次類推;
b)也可以根據編號規則來分表,比如將尾數:將訂單尾數為
1的訂單放到乙個表中,
orders_1
、orders_2
、orders_3
……依次類推;
(
2)表分割槽
a)sql server 2005
以前的版本中,出現過分區檢視,算是它在分割槽表出現前的乙個替代品,有本地分割槽檢視和分布式分割槽檢視兩種。分布式分割槽檢視的概念,倒是有現在分布式儲存的味道,但由於受網路因素影響較大,未被廣泛使用。
b)對於本地化的表分割槽,目前多採用分割槽表,結構如下圖:
3.2.2
、垂直分割
垂直分割針對表中列進行分割。
如果表中列非常多,從而導致一行資料所占用的儲存空間非常大時,可以考慮進行垂直分割,比如:將乙個表拆成主表和從表,主表中存放訪問最頻繁的列,從表中存放訪問較少的列,從而提高資料讀取的效率。
通常不建議使用垂直分割槽,如果主從表都變得很大,在需要進行主從表關聯時,成本也是相當高的,可能會影響效能。
3.3
、簇
簇(cluster
),這是
oracle
裡的乙個概念,將多個表中相同的字段存放到一起,稱為簇,即聚集的意思,這裡需要和聚集索引的概念區分開來。放到一起的好處如下:(1
)節省儲存空間,相同資料只需要存乙份;(2
)提高多表關聯的速度;
資料庫原理(十 三) 物理結構設計
資料庫子啊物理裝置上的儲存結構與訪問方法稱為資料庫的物理結構,它依賴於選定的資料庫管理系統。為乙個給定的邏輯資料模型選取乙個最適合應用要求的物理結構的過程,就是資料庫的物理設計 資料庫的物理設計通常分為兩步 確定資料庫的物理結構,在關聯式資料庫中主要指訪問方法和儲存結構 對物理結構進行評價,評價的重...
資料庫結構設計
1.3概念設計的任務 1.2概念設計的依據 需求分析的文件,需求說明書,功能模型 資料流圖或idef0圖 資訊模型 er圖 和資料庫概念說明書是資料庫邏輯設計的依據 1.2 資料庫概念設計過程 1.3 資料建模方法 er建模方法 idef1x建模方法標識er模型中的聯絡,依次轉換與每個聯絡相關聯的實...
redis資料庫結構設計
之前遊戲開發服務端都是用純c 來寫,現在很多寫遊戲伺服器越來越傾向指令碼語言,因為用c 來寫一些邏輯的確是痛苦之極,當然如果追求效率的還是用c c 實現更好。最近時間自己通過研究了解雲風寫的skynet框架學習了lua,研究skynet其實是想把這框架用到公司現在遊戲專案裡替換掉現在用的乙個純c 框...