01、概述
02、什么是列存儲(chǔ)?
03、在數(shù)據(jù)寫(xiě)入上的對(duì)比
04、在數(shù)據(jù)讀取上的對(duì)比
06、優(yōu)缺點(diǎn)
07、列存儲(chǔ)的適用場(chǎng)景
08、最后總結(jié)如下
01、概述
目前大數(shù)據(jù)存儲(chǔ)有兩種方案可供選擇:行存儲(chǔ)(Row-Based)和列存儲(chǔ)(Column-Based)。
02、什么是列存儲(chǔ)?
列式存儲(chǔ)(column-based)是相對(duì)于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的行式存儲(chǔ)(Row-basedstorage)來(lái)說(shuō)的。簡(jiǎn)單來(lái)說(shuō)兩者的區(qū)別就是如何組織表:
? Row-based storage storesatable in a sequence of rows.
? Column-based storage storesatable in a sequence of columns.
從上圖可以很清楚地看到,行式存儲(chǔ)下一張表的數(shù)據(jù)都是放在一起的,但列式存儲(chǔ)下都被分開(kāi)保存了。所以它們就有了如下這些優(yōu)缺點(diǎn)對(duì)比:
03、在數(shù)據(jù)寫(xiě)入上的對(duì)比
1)行存儲(chǔ)的寫(xiě)入是一次完成。如果這種寫(xiě)入建立在操作系統(tǒng)的文件系統(tǒng)上,可以保證寫(xiě)入過(guò)程的成功或者失敗,數(shù)據(jù)的完整性因此可以確定。
2)列存儲(chǔ)由于需要把一行記錄拆分成單列保存,寫(xiě)入次數(shù)明顯比行存儲(chǔ)多(意味著磁頭調(diào)度次數(shù)多,而磁頭調(diào)度是需要時(shí)間的,一般在1ms~10ms)?,再加上磁頭需要在盤(pán)片上移動(dòng)和定位花費(fèi)的時(shí)間,實(shí)際時(shí)間消耗會(huì)更大。所以,行存儲(chǔ)在寫(xiě)入上占有很大的優(yōu)勢(shì)。
3)還有數(shù)據(jù)修改,這實(shí)際也是一次寫(xiě)入過(guò)程。不同的是,數(shù)據(jù)修改是對(duì)磁盤(pán)上的記錄做刪除標(biāo)記。行存儲(chǔ)是在指定位置寫(xiě)入一次,列存儲(chǔ)是將磁盤(pán)定位到多個(gè)列上分別寫(xiě)入,這個(gè)過(guò)程仍是行存儲(chǔ)的列數(shù)倍。所以,數(shù)據(jù)修改也是以行存儲(chǔ)占優(yōu)。
04、在數(shù)據(jù)讀取上的對(duì)比
1)數(shù)據(jù)讀取時(shí),行存儲(chǔ)通常將一行數(shù)據(jù)完全讀出,如果只需要其中幾列數(shù)據(jù)的情況,就會(huì)存在冗余列,出于縮短處理時(shí)間的考量,消除冗余列的過(guò)程通常是在內(nèi)存中進(jìn)行的。
2)列存儲(chǔ)每次讀取的數(shù)據(jù)是集合的一段或者全部,不存在冗余性問(wèn)題。
3) 兩種存儲(chǔ)的數(shù)據(jù)分布。由于列存儲(chǔ)的每一列數(shù)據(jù)類(lèi)型是同質(zhì)的,不存在二義性問(wèn)題。比如說(shuō)某列數(shù)據(jù)類(lèi)型為整型(int),那么它的數(shù)據(jù)集合一定是整型數(shù)據(jù)。這種情況使數(shù)據(jù)解析變得十分容易。相比之下,行存儲(chǔ)則要復(fù)雜得多,因?yàn)樵谝恍杏涗浿斜4媪硕喾N類(lèi)型的數(shù)據(jù),數(shù)據(jù)解析需要在多種數(shù)據(jù)類(lèi)型之間頻繁轉(zhuǎn)換,這個(gè)操作很消耗CPU,增加了解析的時(shí)間。所以,列存儲(chǔ)的解析過(guò)程更有利于分析大數(shù)據(jù)。
4)從數(shù)據(jù)的壓縮以及更性能的讀取來(lái)對(duì)比
06、優(yōu)缺點(diǎn)
顯而易見(jiàn),兩種存儲(chǔ)格式都有各自的優(yōu)缺點(diǎn):
1)行存儲(chǔ)的寫(xiě)入是一次性完成,消耗的時(shí)間比列存儲(chǔ)少,并且能夠保證數(shù)據(jù)的完整性,缺點(diǎn)是數(shù)據(jù)讀取過(guò)程中會(huì)產(chǎn)生冗余數(shù)據(jù),如果只有少量數(shù)據(jù),此影響可以忽略;數(shù)量大可能會(huì)影響到數(shù)據(jù)的處理效率。
2)列存儲(chǔ)在寫(xiě)入效率、保證數(shù)據(jù)完整性上都不如行存儲(chǔ),它的優(yōu)勢(shì)是在讀取過(guò)程,不會(huì)產(chǎn)生冗余數(shù)據(jù),這對(duì)數(shù)據(jù)完整性要求不高的大數(shù)據(jù)處理領(lǐng)域,比如互聯(lián)網(wǎng),猶為重要。
兩種存儲(chǔ)格式各自的特性都決定了它們的使用場(chǎng)景。
07、列存儲(chǔ)的適用場(chǎng)景
1)一般來(lái)說(shuō),一個(gè)OLAP類(lèi)型的查詢(xún)可能需要訪問(wèn)幾百萬(wàn)甚至幾十億個(gè)數(shù)據(jù)行,且該查詢(xún)往往只關(guān)心少數(shù)幾個(gè)數(shù)據(jù)列。例如,查詢(xún)今年銷(xiāo)量最高的前20個(gè)商品,這個(gè)查詢(xún)只關(guān)心三個(gè)數(shù)據(jù)列:時(shí)間(date)、商品(item)以及銷(xiāo)售量(sales amount)。商品的其他數(shù)據(jù)列,例如商品URL、商品描述、商品所屬店鋪,等等,對(duì)這個(gè)查詢(xún)都是沒(méi)有意義的。
而列式數(shù)據(jù)庫(kù)只需要讀取存儲(chǔ)著“時(shí)間、商品、銷(xiāo)量”的數(shù)據(jù)列,而行式數(shù)據(jù)庫(kù)需要讀取所有的數(shù)據(jù)列。因此,列式數(shù)據(jù)庫(kù)大大地提高了OLAP大數(shù)據(jù)量查詢(xún)的效率
OLTP ?OnLine TransactionProcessor 在線聯(lián)機(jī)事務(wù)處理系統(tǒng)(比如Mysql,Oracle等產(chǎn)品)
OLAP ?OnLine AnalaysierProcessor 在線聯(lián)機(jī)分析處理系統(tǒng)(比如Hive Hbase等)
2)很多列式數(shù)據(jù)庫(kù)還支持列族(column group,Bigtable系統(tǒng)中稱(chēng)為locality group),即將多個(gè)經(jīng)常一起訪問(wèn)的數(shù)據(jù)列的各個(gè)值存放在一起。如果讀取的數(shù)據(jù)列屬于相同的列族,列式數(shù)據(jù)庫(kù)可以從相同的地方一次性讀取多個(gè)數(shù)據(jù)列的值,避免了多個(gè)數(shù)據(jù)列的合并。列族是一種行列混合存儲(chǔ)模式,這種模式能夠同時(shí)滿(mǎn)足OLTP和OLAP的查詢(xún)需求。
3)此外,由于同一個(gè)數(shù)據(jù)列的數(shù)據(jù)重復(fù)度很高,因此,列式數(shù)據(jù)庫(kù)壓縮時(shí)有很大的優(yōu)勢(shì)。
例如,Google Bigtable列式數(shù)據(jù)庫(kù)對(duì)網(wǎng)頁(yè)庫(kù)壓縮可以達(dá)到15倍以上的壓縮率。另外,可以針對(duì)列式存儲(chǔ)做專(zhuān)門(mén)的索引優(yōu)化。比如,性別列只有兩個(gè)值,“男”和“女”,可以對(duì)這一列建立位圖索引:
如下圖所示
“男”對(duì)應(yīng)的位圖為100101,表示第1、4、6行值為“男”
“女”對(duì)應(yīng)的位圖為011010,表示第2、3、5行值為“女”
如果需要查找男性或者女性的個(gè)數(shù),只需要統(tǒng)計(jì)相應(yīng)的位圖中1出現(xiàn)的次數(shù)即可。另外,建立位圖索引后0和1的重復(fù)度高,可以采用專(zhuān)門(mén)的編碼方式對(duì)其進(jìn)行壓縮。
當(dāng)然,如果每次查詢(xún)涉及的數(shù)據(jù)量較小或者大部分查詢(xún)都需要整行的數(shù)據(jù),列式數(shù)據(jù)庫(kù)并不適用。
08、最后總結(jié)如下
①數(shù)據(jù)是按行存儲(chǔ)的。
②沒(méi)有索引的查詢(xún)使用大量I/O。比如一般的數(shù)據(jù)庫(kù)表都會(huì)建立索引,通過(guò)索引加快查詢(xún)效率。
③建立索引和物化視圖需要花費(fèi)大量的時(shí)間和資源。
④面對(duì)查詢(xún)需求,數(shù)據(jù)庫(kù)必須被大量膨脹才能滿(mǎn)足需求。
列式數(shù)據(jù)庫(kù)的特性如下:
①數(shù)據(jù)按列存儲(chǔ),即每一列單獨(dú)存放。
②數(shù)據(jù)即索引。
③只訪問(wèn)查詢(xún)涉及的列,可以大量降低系統(tǒng)I/O。
④每一列由一個(gè)線程來(lái)處理,即查詢(xún)的并發(fā)處理性能高。
⑤數(shù)據(jù)類(lèi)型一致,數(shù)據(jù)特征相似,可以高效壓縮。比如有增量壓縮、前綴壓縮算法都是基于列存儲(chǔ)的類(lèi)型定制的,所以可以大幅度提高壓縮比,有利于存儲(chǔ)和網(wǎng)絡(luò)輸出數(shù)據(jù)帶寬的消耗。
審核編輯:湯梓紅
評(píng)論
查看更多