為什麼要選擇列式存儲
行式存儲和列式存儲主要是在實體存儲的選擇上面,這裡主要是選擇從實體的完整性角度進行存儲,還是從實體特征次元進行存儲,行式存儲就是以實體為機關進行存儲,在實體存儲上,一個實體(的特征屬性)緊挨着另外一個實體;列式存儲就是從實體特征次元進行存儲,通常是以列為實體存儲單元,這種存儲模式也決定了查詢的模式也是基于列取查詢;是以,當我們想要按照實體去查詢列式存儲的資料,一般都是需要并行查詢,是以列式存儲天生的是分布式資料庫的架構。
在OLTP場景,更多的基于實體的維護和查詢,但是在OLAP場景,則是更多地從實體特征角度進行資料處理(統計),是以在OLAP的場景下,如果還是使用行式存儲,會導緻大量的無謂的周遊,比如想要對某個列進行所有資料的統計,因為是行式存儲,需要周遊所有的實體的所有的屬性;如果列式存儲,則隻需要按照列進行查詢即可,因為列式存儲是以列一個實體存儲單元,是以周遊隻要周遊相應列的實體存儲檔案即可。
那麼從這個角度上面來講,HBase其實是行列存儲的一個綜合體,從宏觀角度是按照列簇為機關進行存儲,從微觀角度,每一個列簇的單元是由key,value的鍵值對組成(可能是很多歌鍵值對,因為一個列簇可以包含很多列),但是values其實是行式存儲,另外HBase并不建議采用度過列簇,列簇不要超過2個,是以列式存儲的優勢并沒有完全發揮出來,但是基于HBase的技術架構,隻能這樣處理,如果是純粹的列式存儲對于HBase的性能會有大影響。
采用列式存儲還有一個好處就是可以友善的進行編碼和壓縮,因為一列中的值大機率是有大量重複的,可以對于這些重複的值進行編碼以及壓縮,節省存儲空間。