列式存儲vs行式存儲

為什麼要按列存儲?

列式存儲(Columnar or column-based)是相對於傳統關係型數據庫的行式存儲(Row-based storage)來說的。簡單來說兩者的區別就是如何組織表:

  • Row-based storage stores a table in a sequence of rows.
  • Column-based storage stores a table in a sequence of columns.


與行存儲將每一行的數據連續存儲不同,列存儲將每一列的數據連續存儲。示例圖如下:

列式存儲vs行式存儲


相比於行式存儲,列式存儲在分析場景下有著許多優良的特性。

1)分析場景中往往需要讀大量行但是少數幾個列。在行存模式下,數據按行連續存儲,所有列的數據都存儲在一個block中,不參與計算的列在IO時也要全部讀出,讀取操作被嚴重放大。而列存模式下,只需要讀取參與計算的列即可,極大的減低了IO cost,加速了查詢。

2)同一列中的數據屬於同一類型,壓縮效果顯著。列存儲往往有著高達十倍甚至更高的壓縮比,節省了大量的存儲空間,降低了存儲成本。

3)更高的壓縮比意味著更小的data size,從磁盤中讀取相應數據耗時更短。

4)自由的壓縮算法選擇。不同列的數據具有不同的數據類型,適用的壓縮算法也就不盡相同。可以針對不同列類型,選擇最合適的壓縮算法。

5)高壓縮比,意味著同等大小的內存能夠存放更多數據,系統cache效果更好。


列式存儲vs行式存儲

官方數據顯示,通過使用列存,在某些分析場景下,能夠獲得100倍甚至更高的加速效應。



分享到:


相關文章: