傳統的行儲存和(HBase)列儲存的區別

2021-09-03 01:53:58 字數 3680 閱讀 5778

列式儲存(columnar or column-based)是相對於傳統關係型資料庫的行式儲存(row-basedstorage)來說的。簡單來說兩者的區別就是如何組織表(翻譯不好,直接抄原文了):

ø  row-based storage stores atable in a sequence of rows.

ø  column-based storage storesa table in a sequence of columns.

下面來看乙個例子:

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

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

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

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

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

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

4)從資料的壓縮以及更效能的讀取來對比

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

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

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

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

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

而列式資料庫只需要讀取儲存著「時間、商品、銷量」的資料列,而行式資料庫需要讀取所有的資料列。因此,列式資料庫大大地提高了olap大資料量查詢的效率

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

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

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

如下圖所示

「男」對應的點陣圖為100101,表示第1、4、6行值為「男」

「女」對應的點陣圖為011010,表示第2、3、5行值為「女」

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

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

傳統行式資料庫的特性如下:

①資料是按行儲存的。

②沒有索引的查詢使用大量i/o。比如一般的資料庫表都會建立索引,通過索引加快查詢效率。

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

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

列式資料庫的特性如下:

①資料按列儲存,即每一列單獨存放。

②資料即索引。

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

④每一列由乙個執行緒來處理,即查詢的併發處理效能高。

⑤資料型別一致,資料特徵相似,可以高效壓縮。比如有增量壓縮、字首壓縮演算法都是基於列儲存的型別定製的,所以可以大幅度提高壓縮比,有利於儲存和網路輸出資料頻寬的消耗。

行式儲存

列式儲存

優點

ø  資料被儲存在一起

ø  insert/update容易

ø  查詢時只有涉及到的列會被讀取

ø  投影(projection)很高效

ø  任何列都能作為索引

缺點

ø  選擇(selection)時即使只涉及某幾列,所有資料也都會被讀取

ø  選擇完成時,被選擇的列要重新組裝

ø  insert/update比較麻煩

注:關係型資料庫理論回顧 - 選擇(selection)和投影(projection)

剛才其實跳過了資料裡提到的另一種技術:通過字典表壓縮資料。為了方便後面的講解,這部分也順帶提一下。

下面才是那張表本來的樣子。經過字典表進行資料壓縮後,表中的字串才都變成數字了。正因為每個字串在字典表裡只出現一次了,所以達到了壓縮的目的(有點像規範化和非規範化normalize和denomalize)

下面就是最牛的圖了,通過一條查詢的執行過程說明列式儲存(以及資料壓縮)的優點:

關鍵步驟如下:

1.     去字典表裡找到字串對應數字(只進行一次字串比較)。

2.     用數字去列表裡匹配,匹配上的位置設為1。

3.     把不同列的匹配結果進行位運算得到符合所有條件的記錄下標。

4.     使用這個下標組裝出最終的結果集。

傳統的行儲存和(HBase)列儲存的區別

列式儲存 columnar or column based 是相對於傳統關係型資料庫的行式儲存 row basedstorage 來說的。簡單來說兩者的區別就是如何組織表 翻譯不好,直接抄原文了 row based storage stores atable in a sequence of row...

行儲存和列儲存的區別

列儲存不同於傳統的關係型資料庫,其資料在表中是按行儲存的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。按列儲存每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量,乙個欄位的資料聚集儲存,那就更容易為這種聚集儲存設計更...

行儲存和列儲存的區別

一 對比行儲存和列儲存的區別前,我們先來聊下背景。假設我們用mysql做了乙個商品訂單庫order,如下 orderid name kind price kgtime1豬肉 肉類50 2.02020.01.012牛肉 肉類60 1.02020.01.013白菜 蔬菜61.02020.01.01 二 ...