行存和列存
在行存儲的數據庫系統中,一行中的所有字段值都是連續存儲的;在基于行存儲的表中,即使只需要讀取指定列時,也需要先將對應行的數據讀取到內存,再過濾目標列,這樣會導致過多的磁盤IO、內存和時間開銷,所以行式存儲比較適用于每次需要訪問完整行的場景。
基于列的存儲,是將列數據連續存儲在一起。因為是將相同類型的數據存儲在了一起,
列存儲通常能提供更好的壓縮率,因為同一列的數據類型相同,數據特征更加相似。
加速查詢性能,特別對于只需要少量列的分析計算(如SUM、AVG、MIN、MAX)在列存儲中非常高效。
選擇行存儲還是列存儲通常取決于應用的特定需求。如果應用需要頻繁執行事務性操作,如增加、更新、刪除記錄,那么行存儲數據庫可能是更好的選擇。如果應用主要進行讀操作,尤其是大規模數據分析和報告,其中聚合和只讀取部分列是常態,那么列存儲數據庫可能更適合。
HBase
HBase表數據模型比較特別可以簡單理解為有行和列的二維表,只是它的列稱為“列族”,列族下面又可以在數據寫入時指定很多的子列。另外,HBase物理存儲上是將整個列族數據存儲在一起的。所以,如果HBase中的一張表只有一個列族的話,等于是這個列族包含了這張表的所有列,也就是將表正行的數據連續存儲在了一起,就等于是行式存儲了。再比如,一張表有多個列族,并且每個列族下僅有一列(雖然HBase不建議這么做),也就是將表的列數據連續存儲在了一起,就等于是列式存儲了。
總而言之,HBase具有列族的特性,它的物理存儲可視為按列族組織的,但從邏輯層面和數據訪問模式來看,它同時體現了按行存儲的特點。因此,將HBase定性為純粹的列式存儲系統或行式存儲系統都不夠準確,它更應被看作是一種結合了列族和行存儲優點的特殊數據庫系統。