數(shù)據(jù)存儲(chǔ)方式有哪些?這3種數(shù)據(jù)存儲(chǔ)方式了解嗎?
掃描二維碼
隨時(shí)隨地手機(jī)看文章
數(shù)據(jù)存儲(chǔ)具有很強(qiáng)的現(xiàn)實(shí)意義,只有采取合理的數(shù)據(jù)存儲(chǔ)方式,才能夠有利于數(shù)據(jù)的管理、檢索等。為增進(jìn)大家對(duì)數(shù)據(jù)存儲(chǔ)方式的認(rèn)識(shí),本文將對(duì)三種數(shù)據(jù)存儲(chǔ)方式予以介紹。如果你對(duì)數(shù)據(jù)存儲(chǔ)方式具有興趣,不妨繼續(xù)往下閱讀哦。
數(shù)據(jù)存儲(chǔ)在實(shí)際應(yīng)用中,就是怎么用數(shù)據(jù)庫(kù)把我們的業(yè)務(wù)數(shù)據(jù)保存起來(lái)。從宏觀角度看,大致包含三大類技術(shù):B-TREE,LSM&SSTable,列式存儲(chǔ)。
一、B-TREE
B-TREE和關(guān)系模型同步出現(xiàn)于70年代,到90年幾乎占領(lǐng)了所有的數(shù)據(jù)庫(kù)市場(chǎng)。B-TREE簡(jiǎn)單的理解就是多葉節(jié)點(diǎn)的樹(shù),每個(gè)葉節(jié)點(diǎn)并非是每行數(shù)據(jù),而是數(shù)據(jù)庫(kù)的的數(shù)據(jù)塊。這么設(shè)計(jì)的原因是樹(shù)的層次影響著搜索性能,而且磁盤(pán)的讀寫(xiě)是基于塊(BLOCK)的,使用塊可以大大減少節(jié)點(diǎn)數(shù)量,進(jìn)而減少樹(shù)的層次。
B-TREE的特點(diǎn)在于讀寫(xiě)性能比較穩(wěn)定,響應(yīng)時(shí)間和磁盤(pán)隨機(jī)讀寫(xiě)的時(shí)間成正比(10ms)。并且由于B-TREE對(duì)應(yīng)到數(shù)據(jù)庫(kù)的每條記錄,可以很容易的實(shí)現(xiàn)事務(wù)、行鎖和隔離級(jí)別。讀性能略高于LSM算法。而且B-TREE基于塊的存儲(chǔ)方式,可以很容易的把內(nèi)存中的塊和磁盤(pán)上的塊一一對(duì)應(yīng)起來(lái),很容易的實(shí)現(xiàn)緩存。在實(shí)際應(yīng)用中,前2-3級(jí)節(jié)點(diǎn)內(nèi)都可以在緩存中讀取,由此大大提高了訪問(wèn)效率。
而不足在于真正面對(duì)海量數(shù)據(jù)時(shí)(如數(shù)據(jù)量進(jìn)入到百億級(jí)別時(shí)),由于樹(shù)層數(shù)和緩存比率的減少,會(huì)導(dǎo)致性能逐步下降。此外由于B-TREE在寫(xiě)入時(shí)也需要通過(guò)搜索定位到葉節(jié)點(diǎn),因此相對(duì)于LSM,其寫(xiě)入時(shí)開(kāi)銷較大。PS:其實(shí)現(xiàn)在已經(jīng)出現(xiàn)了分布式的B-TREE,比如oracle的localeindex。
二、LSM&SSTable
目前主流的存儲(chǔ)架構(gòu)還是磁盤(pán)+內(nèi)存,磁盤(pán)順序讀寫(xiě)的性能高于隨機(jī)讀寫(xiě)三個(gè)數(shù)量級(jí),而在內(nèi)存中進(jìn)行隨機(jī)讀寫(xiě)的的性能也大于磁盤(pán)的三個(gè)數(shù)量級(jí),可以得出用磁盤(pán)當(dāng)做磁帶一樣只做順序讀寫(xiě),而把內(nèi)存當(dāng)做磁盤(pán),提供所有的隨機(jī)讀寫(xiě)訪問(wèn)的總體思想,這也就是出LSM-Tree的算法。
簡(jiǎn)單說(shuō)就是在內(nèi)存中維護(hù)一張MemTable,把所有最新的數(shù)據(jù)都寫(xiě)到其中,所有數(shù)據(jù)依據(jù)key值進(jìn)行排序(隨機(jī)讀寫(xiě))。當(dāng)MemTable的大小到大閾值之后,把它寫(xiě)到磁盤(pán)上,形成一個(gè)個(gè)的SSTable(順序?qū)?。每個(gè)SSTable構(gòu)造一個(gè)索引,由于SSTable中的數(shù)據(jù)都是排好序的,所以索引較小,可以保存在內(nèi)存里面,所以所有的索引搜索動(dòng)作都是在內(nèi)存進(jìn)行的(隨機(jī)讀)。
每次查找的過(guò)程如下:首先在MemTable中搜索(內(nèi)存隨機(jī)查找),如果沒(méi)有依次在每個(gè)SSTable的索引中查找(內(nèi)存隨機(jī)查找)。把查找從磁盤(pán)隨機(jī)動(dòng)作變成了基于內(nèi)存的隨機(jī)動(dòng)作。隨著SSTable的增多,搜索的次數(shù)會(huì)增加,為了提高性能,后臺(tái)會(huì)把多個(gè)SSTable合并為一個(gè)(如HBase、LevelDB等等)。并且提供布隆過(guò)濾器(BloomFilter)來(lái)過(guò)濾掉不需要的SSTable。從總體效果上看,寫(xiě)入的效率大大高于基于B-Tree的存儲(chǔ)引擎,而讀取性能接近于B-Tree。
LSM&SSTable在寫(xiě)入密集型應(yīng)用中有較大優(yōu)勢(shì),同時(shí)在讀取方面也有不錯(cuò)的表現(xiàn)。不足之處在于上面提到的,不定期對(duì)增加的SSTable進(jìn)行合并時(shí),對(duì)于數(shù)據(jù)庫(kù)會(huì)產(chǎn)生一定壓力。
由于這些特點(diǎn),LSM&SSTable大量應(yīng)用于許多組件中,比如HBase、LevelDB等KeyValue數(shù)據(jù)庫(kù)中,同時(shí)也在消息引擎Kafka和搜索引擎Solr使用。
三、列式存儲(chǔ)
以上兩種存儲(chǔ)引擎主要適合于聯(lián)機(jī)場(chǎng)景,如有大量的基于客戶各類行為數(shù)據(jù)的批量計(jì)算的推薦系統(tǒng)中,以及預(yù)計(jì)客戶的流動(dòng)性缺口等等。在這些場(chǎng)景中,列式存儲(chǔ)在性能上有非常明顯的優(yōu)勢(shì)。隨著各類大數(shù)據(jù)應(yīng)用的擴(kuò)展,列式存儲(chǔ)從和Hive共生的ORC,到和Spark共生的Parquet也被應(yīng)用到了各個(gè)數(shù)據(jù)分析應(yīng)用中。
從傳統(tǒng)的數(shù)據(jù)分析類應(yīng)用,到人工智能應(yīng)用,都需要遍歷整個(gè)數(shù)據(jù)集,上面也提到磁盤(pán)在順序讀寫(xiě)和隨機(jī)讀寫(xiě)性能方面的巨大差距,所以所有的數(shù)據(jù)倉(cāng)庫(kù)都會(huì)在全表遍歷中采用磁盤(pán)順序遍歷。所以遍歷的文件空間越小,性能越高。列式存儲(chǔ)按列對(duì)數(shù)據(jù)進(jìn)行保存,以減少數(shù)據(jù)庫(kù)每次訪問(wèn)的文件尺寸。
首先,分析應(yīng)用一般局限于對(duì)于表中的部分字段都分析,列是存儲(chǔ)可以讓引擎只訪問(wèn)部分字段,減少吞吐量。其次,列式存儲(chǔ)數(shù)據(jù)壓縮能力更強(qiáng)。因?yàn)樾屑?jí)別的存儲(chǔ)方式壓縮是基于數(shù)據(jù)塊,壓縮比大致為50%-70%左右,而且壓縮比越大,解壓縮對(duì)于CPU的占用也越大。由于單列內(nèi)的數(shù)據(jù)非常類似,尤其是各種碼值類的數(shù)據(jù),比如性別(男、女、其他),行數(shù)越多,壓縮比越大。10億客戶的性別,也可以簡(jiǎn)單的表達(dá)為如下這樣:“連續(xù)100個(gè)男性、連續(xù)50個(gè)女性、又連續(xù)80個(gè)男性、連續(xù)70個(gè)女性”,按照每行的位置依次表達(dá)下去。
再次,同樣由于列內(nèi)數(shù)據(jù)的取值范圍有限,也可通過(guò)位圖來(lái)表達(dá),比如10表示男,01表示女,因此只用2個(gè)bit就可以表示出來(lái),從而進(jìn)一步增加壓縮比。在在許多場(chǎng)景中能夠把以前數(shù)G的數(shù)據(jù)壓縮為幾百K。由此可以顯著降低批量計(jì)算時(shí)對(duì)于存儲(chǔ)的吞吐壓力和提升計(jì)算效率。
當(dāng)然列式存儲(chǔ)也并非完美,在更新時(shí)列式存儲(chǔ)相對(duì)行式存儲(chǔ),很難直接做到就地修改的效果,往往需要把整列鎖住,重新計(jì)算,重新生成整個(gè)列。所以列式存儲(chǔ)更多的適合于數(shù)據(jù)分析時(shí)需要全表遍歷的場(chǎng)景。
以上便是此次小編帶來(lái)的數(shù)據(jù)存儲(chǔ)相關(guān)內(nèi)容,通過(guò)本文,希望大家對(duì)數(shù)據(jù)存儲(chǔ)方式具備一定的了解。如果你喜歡本文,不妨持續(xù)關(guān)注我們網(wǎng)站哦,小編將于后期帶來(lái)更多精彩內(nèi)容。最后,十分感謝大家的閱讀,have a nice day!