概述
目前大資料儲存有兩種方案可供選擇:行儲存(row-based)和列儲存(column-based)。業界對兩種儲存方案有很多爭持,集中焦點是:誰能夠更有效地處理海量資料,且兼顧安全、可靠、完整性。從目前發展情況看,關聯式資料庫已經不適應這種巨大的儲存量和計算要求,基本是淘汰出局。在已知的幾種大資料處理軟體中,hadoop的hbase採用列儲存,mongodb是文件型的行儲存,lexst是二進位制型的行儲存。
什麼是列儲存?
列式儲存(column-based)是相對於傳統關係型資料庫的行式儲存(row-basedstorage)來說的。簡單來說兩者的區別就是如何組織表:
從上圖可以很清楚地看到,行式儲存下一張表的資料都是放在一起的,但列式儲存下都被分開儲存了。所以它們就有了如下這些優缺點對比:
在資料寫入上的對比
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。
④每一列由乙個執行緒來處理,即查詢的併發處理效能高。
⑤資料型別一致,資料特徵相似,可以高效壓縮。比如有增量壓縮、字首壓縮演算法都是基於列儲存的型別定製的,所以可以大幅度提高壓縮比,有利於儲存和網路輸出資料頻寬的消耗。
列儲存與行儲存
上個月參加了乙個 雲儲存的技術討論會。這乙個月裡,陸續收到幾位同學討論 大資料儲存和處理的郵件。今天是週末,索性把這個月的交流內容整理寫下來,供各位參考。目前大資料儲存有兩種方案可供選擇 行儲存和列儲存。業界對兩種儲存方案有很多爭持,集中焦點是 誰能夠更有效地處理海量資料,且兼顧安全 可靠 完整性。...
行儲存與列儲存
列式儲存 columnar or column based 是相對於傳統關係型資料庫的行式儲存 row basedstorage 來說的。簡單來說兩者的區別就是如何組織表 翻譯不好,直接抄原文了 row based storage stores atable in a sequence of row...
大資料儲存 行儲存還是列儲存
目前大資料儲存有兩種方案可供選擇 行儲存和列儲存。業界對兩種儲存方案有很多爭持,集中焦點是 誰能夠更有效地處理海量資料,且兼顧安全 可靠 完整性。從目前發展情況看,關聯式資料庫已經不適應這種巨大的儲存量和計算要求,基本是淘汰出局。在已知的幾種大資料處理軟體中,hadoop的hbase採用列儲存,mo...