行存儲 VS 列存儲

來源:blog.csdn.ne‍p‍t/Xingxinxinxin/article/details/80939277


01、概述

目前大數據存儲有兩種方案可供選擇:行存儲(Row-Based)和列存儲(Column-Based)。

02、什麼是列存儲?

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

Ø Row-based storage storesatable in a sequence of rows.

Ø Column-based storage storesatable in a sequence of columns.

圖片

從上圖可以很清楚地看到,行式存儲下一張表的數據都是放在一起的,但列式存儲下都被分開保存了。所以它們就有了如下這些優缺點對比:

03、在數據寫入上的對比

1)行存儲的寫入是一次完成。如果這種寫入建立在操作系統的文件系統上,可以保證寫入過程的成功或者失敗,數據的完整性因此可以確定。

2)列存儲由於需要把一行記錄拆分成單列保存,寫入次數明顯比行存儲多(意味着磁頭調度次數多,而磁頭調度是需要時間的,一般在 1ms~10ms) ,再加上磁頭需要在盤片上移動和定位花費的時間,實際時間消耗會更大。所以,行存儲在寫入上佔有很大的優勢。

3)還有數據修改, 這實際也是一次寫入過程。不同的是,數據修改是對磁盤上的記錄做刪除標記。行存儲是在指定位置寫入一次,列存儲是將磁盤定位到多個列上分別寫入,這個過程仍是行存儲的列數倍。所以,數據修改也是以行存儲佔優。

04、在數據讀取上的對比

1)數據讀取時,行存儲通常將一行數據完全讀出,如果只需要其中幾列數據的情況,就會存在冗餘列,出於縮短處理時間的考量,消除冗餘列的過程通常是在內存中進行的。

2)列存儲每次讀取的數據是集合的一段或者全部,不存在冗餘性問題。

3) 兩種存儲的數據分佈。由於列存儲的每一列數據類型是同質的,不存在二義性問題。比如說某列數據類型爲整型 (int),那麼它的數據集合一定是整型數據。這種情況使數據解析變得十分容易。相比之下,行存儲則要複雜得多,因爲在一行記錄中保存了多種類型的數據,數據解析需要在多種數據類型之間頻繁轉換,這個操作很消耗 CPU,增加了解析的時間。所以,列存儲的解析過程更有利於分析大數據。

4)從數據的壓縮以及更性能的讀取來對比

06、優缺點

顯而易見,兩種存儲格式都有各自的優缺點:

1)行存儲的寫入是一次性完成,消耗的時間比列存儲少,並且能夠保證數據的完整性,缺點是數據讀取過程中會產生冗餘數據,如果只有少量數據,此影響可以忽略; 數量大可能會影響到數據的處理效率。

2)列存儲在寫入效率、保證數據完整性上都不如行存儲,它的優勢是在讀取過程,不會產生冗餘數據,這對數據完整性要求不高的大數據處理領域,比如互聯網,猶爲重要。

兩種存儲格式各自的特性都決定了它們的使用場景。

07、列存儲的適用場景

1)一般來說,一個 OLAP 類型的查詢可能需要訪問幾百萬甚至幾十億個數據行,且該查詢往往只關心少數幾個數據列。例如,查詢今年銷量最高的前 20 個商品,這個查詢只關心三個數據列:時間(date)、商品(item)以及銷售量(sales amount)。商品的其他數據列,例如商品 URL、商品描述、商品所屬店鋪,等等,對這個查詢都是沒有意義的。

而列式數據庫只需要讀取存儲着 “時間、商品、銷量” 的數據列,而行式數據庫需要讀取所有的數據列。因此,列式數據庫大大地提高了 OLAP 大數據量查詢的效率

OLTP  OnLine TransactionProcessor 在線聯機事務處理系統(比如 Mysql,Oracle 等產品)

OLAP  OnLine AnalaysierProcessor 在線聯機分析處理系統(比如 Hive Hbase 等)

2)很多列式數據庫還支持列族(column group,Bigtable 系統中稱爲 locality group),即將多個經常一起訪問的數據列的各個值存放在一起。如果讀取的數據列屬於相同的列族,列式數據庫可以從相同的地方一次性讀取多個數據列的值,避免了多個數據列的合併。列族是一種行列混合存儲模式,這種模式能夠同時滿足 OLTP 和 OLAP 的查詢需求。

3)此外,由於同一個數據列的數據重複度很高,因此,列式數據庫壓縮時有很大的優勢。

例如,Google Bigtable 列式數據庫對網頁庫壓縮可以達到 15 倍以上的壓縮率。另外,可以針對列式存儲做專門的索引優化。比如,性別列只有兩個值,“男” 和 “女”,可以對這一列建立位圖索引:

如下圖所示

“男” 對應的位圖爲 100101,表示第 1、4、6 行值爲 “男”

“女” 對應的位圖爲 011010,表示第 2、3、5 行值爲 “女”

如果需要查找男性或者女性的個數,只需要統計相應的位圖中 1 出現的次數即可。另外,建立位圖索引後 0 和 1 的重複度高,可以採用專門的編碼方式對其進行壓縮。

當然,如果每次查詢涉及的數據量較小或者大部分查詢都需要整行的數據,列式數據庫並不適用。

08、最後總結如下

①數據是按行存儲的。

②沒有索引的查詢使用大量 I/O。比如一般的數據庫表都會建立索引,通過索引加快查詢效率。

③建立索引和物化視圖需要花費大量的時間和資源。

④面對查詢需求,數據庫必須被大量膨脹才能滿足需求。

列式數據庫的特性如下:

①數據按列存儲,即每一列單獨存放。

②數據即索引。

③只訪問查詢涉及的列,可以大量降低系統 I/O。

④每一列由一個線程來處理,即查詢的併發處理性能高。

⑤數據類型一致,數據特徵相似,可以高效壓縮。比如有增量壓縮、前綴壓縮算法都是基於列存儲的類型定製的,所以可以大幅度提高壓縮比,有利於存儲和網絡輸出數據帶寬的消耗。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8oljc4VX8_3MrFxq45FvdA