為什麼要按列存儲?
列式存儲(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.
與行存儲將每一行的數據連續存儲不同,列存儲將每一列的數據連續存儲。示例圖如下:
相比於行式存儲,列式存儲在分析場景下有著許多優良的特性。
1)分析場景中往往需要讀大量行但是少數幾個列。在行存模式下,數據按行連續存儲,所有列的數據都存儲在一個block中,不參與計算的列在IO時也要全部讀出,讀取操作被嚴重放大。而列存模式下,只需要讀取參與計算的列即可,極大的減低了IO cost,加速了查詢。
2)同一列中的數據屬於同一類型,壓縮效果顯著。列存儲往往有著高達十倍甚至更高的壓縮比,節省了大量的存儲空間,降低了存儲成本。
3)更高的壓縮比意味著更小的data size,從磁盤中讀取相應數據耗時更短。
4)自由的壓縮算法選擇。不同列的數據具有不同的數據類型,適用的壓縮算法也就不盡相同。可以針對不同列類型,選擇最合適的壓縮算法。
5)高壓縮比,意味著同等大小的內存能夠存放更多數據,系統cache效果更好。
官方數據顯示,通過使用列存,在某些分析場景下,能夠獲得100倍甚至更高的加速效應。
閱讀更多 軟件架構 的文章