總覽
數據庫的數據存儲有兩種類型,一種是面向行的(row-oriented)數據庫,另一種是面向列的(column-oriented )數據庫。
面向行(事務型) 數據庫
該類數據庫是根據記錄(record)組織數據的,將所有與記錄相關聯的數據保存在內存中。面向行的數據庫是組織數據的傳統方式,并且為快速存儲數據提供了一些關鍵優勢。它們經過優化,可以高效地讀取和寫入行。
常見的面向行的數據庫:
- PostgreSQL
- MySQL
優點
- 行存儲的寫入是一次性完成,消耗的時間比列存儲少,并且能夠保證數據的完整性;
- insert/update更容易
缺點
- 沒有索引的查詢會產生大量的I/O
- 建立索引需要花費大量時間和資源
- 面對查詢的需求,數據庫必須被大量膨脹才能滿足性能的需求
面向列(分析型) 數據庫:
該類數據庫是按字段組織數據的,在內存中將所有與字段相關聯的數據保存在一起。該類數據庫在讀取和計算列有明顯的優勢。
常用的面向列的數據庫
- AWS RedShift
- Google BigQuery
- HBase
優點
- 只查詢涉及的列,會大量降低系統I/O,適合并發查詢
- 數據類型一致,數據特征相似,能對數據進行高效壓縮
- 非常適合做聚合操作
缺點
- 缺乏數據完整性保證,寫入效率低
- 不適合頻繁delete/update操作
面向行的數據庫
傳統的關系型數據庫管理系統(DBMS)都是面向行的。在行存儲或面向行的數據庫中,數據是逐行存儲的,這樣,行的第一列將挨著前一行的最后一列。
比如,有下面的一張表
這些數據將被存儲在一個面向行的數據庫中的一個磁盤上,按照下面這樣的順序一行一行的排列:
這允許數據庫快速寫入一行,因為要寫入數據,只需在數據的末尾添加另一行即可。
面向行的數據庫仍然通常用于聯機事務處理(OLTP)的應用程序,因為它們可以很好地管理對數據庫的寫操作。對于聯機分析處理(OLAP)的場景需要一個支持特定數據查詢的數據庫。這就是面向行的數據庫比面向列的數據庫慢的地方。
讀取面向行的數據庫
面向行的數據庫檢索行或一組行的速度很快,但在執行聚合時,它將額外的數據(列)帶入內存,這比只選擇要執行聚合的列要慢。此外,面向行的數據庫可能需要訪問的磁盤數量通常更多。
因此,我們可以看到,雖然向面向行的數據庫添加數據是快速和簡單的,但從中獲取數據可能需要使用額外的內存和訪問多個磁盤。
面向列的數據庫
數據倉庫的創建是為了支持數據分析。這些類型的數據庫通常對數據讀取做了優化。
在面向列的數據庫中,數據的存儲形式為列中的每一行都挨著同一列中的其他行。
仍然以上面的表為例:
一個表一次存儲一列,按照一行一行的順序排列:
寫入面向列的數據庫
如果我們想要添加一個新記錄,必須先定位數據的位置(比如HBASE的三級尋址),將每一列插入到它應該在的位置。
如果數據存儲在一個單獨的磁盤上,那么它將有與面向行的數據庫相同的額外內存問題,因為它需要將所有內容都放入內存中。但是,當存儲在單獨的磁盤上時,面向列的數據庫將有很大的好處。
從面向列的數據庫中讀取
只需要計算需要的列,減少磁盤掃描,減少不必要的內存開銷,只需要訪問極少數量的磁盤。
附錄(SQL知識大圖)
原文鏈接: