一分鐘搞懂列式與行式數(shù)據(jù)庫
定義
列式存儲(chǔ)(Column-based)是相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的行式存儲(chǔ)(Row-based)來說的。簡單來說兩者的區(qū)別就是如何組織表。
將表放入存儲(chǔ)系統(tǒng)中有兩種方法,而我們絕大部分是采用行存儲(chǔ)的。行存儲(chǔ)法是將各行放入連續(xù)的物理位置,這很像傳統(tǒng)的記錄和文件系統(tǒng)。列存儲(chǔ)法是將數(shù)據(jù)按照列存儲(chǔ)到數(shù)據(jù)庫中,與行存儲(chǔ)類似,下圖是兩種存儲(chǔ)方法的圖形化解釋。
應(yīng)用行式存儲(chǔ)的數(shù)據(jù)庫系統(tǒng)稱為行式數(shù)據(jù)庫,同理應(yīng)用列式存儲(chǔ)的數(shù)據(jù)庫系統(tǒng)稱為列式數(shù)據(jù)庫。隨著列式數(shù)據(jù)庫的發(fā)展,傳統(tǒng)的行式數(shù)據(jù)庫加入了列式存儲(chǔ)的支持,形成具有兩種存儲(chǔ)方式的數(shù)據(jù)庫系統(tǒng)。
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,如Oracle、DB2、MySQL、SQL SERVER等采用行式存儲(chǔ)法,當(dāng)然傳統(tǒng)的關(guān)系型數(shù)據(jù)庫也在不斷發(fā)展中。隨著Oracle 12c推出了in memory組件,使得Oracle數(shù)據(jù)庫具有了雙模式數(shù)據(jù)存放方式,從而能夠?qū)崿F(xiàn)對混合類型應(yīng)用的支持:傳統(tǒng)的以行形式保存的數(shù)據(jù)滿足OLTP應(yīng)用;列形式保存的數(shù)據(jù)滿足以查詢?yōu)橹鞯腛LAP應(yīng)用。
新興的Hbase、HP Vertica、EMC Greenplum等分布式數(shù)據(jù)庫采用列式存儲(chǔ),當(dāng)然這些數(shù)據(jù)庫也有對行式存儲(chǔ)的支持比如HP Vertica。
隨著傳統(tǒng)關(guān)系型數(shù)據(jù)庫與新興的分布式數(shù)據(jù)庫不斷的發(fā)展,列式存儲(chǔ)與行式存儲(chǔ)會(huì)不斷融合,數(shù)據(jù)庫系統(tǒng)會(huì)呈現(xiàn)雙模式數(shù)據(jù)存放方式,這也是商業(yè)競爭的需要。
區(qū)別
為啥列存儲(chǔ)可以大幅降低系統(tǒng)的I/O呢?
列式存儲(chǔ)的主要優(yōu)點(diǎn)之一就是可以大幅降低系統(tǒng)的I/O,尤其是在海量數(shù)據(jù)查詢時(shí),I/O向來是系統(tǒng)的主要瓶頸之一。通過下面這張圖,相信大家能夠徹底明白這一點(diǎn)。
應(yīng)用場景
在比較了行式數(shù)據(jù)庫與列式數(shù)據(jù)庫之后,我們更關(guān)心的是如何根據(jù)業(yè)務(wù)場景需要選擇對應(yīng)的數(shù)據(jù)庫系統(tǒng)。
行式更適合OLTP,比如傳統(tǒng)的基于增刪改查操作的應(yīng)用。列式更適合OLAP,非常適合于在數(shù)據(jù)倉庫領(lǐng)域發(fā)揮作用,比如數(shù)據(jù)分析、海量存儲(chǔ)和商業(yè)智能;涉及不經(jīng)常更新的數(shù)據(jù)。
由于設(shè)計(jì)上的不同,列式數(shù)據(jù)庫在并行查詢處理和壓縮上更有優(yōu)勢。而且數(shù)據(jù)是以列為單元存儲(chǔ),完全不用考慮數(shù)據(jù)建模或者說建模更簡單了。要查詢計(jì)算哪些列上的數(shù)據(jù),直接讀取列就行。
***我們需要?jiǎng)?wù)實(shí)的指出,沒有***的數(shù)據(jù)庫,列式數(shù)據(jù)庫也并非***,只不過給DBA提供了更多的選擇,DBA需根據(jù)自己的應(yīng)用場景自行選擇。
【本文為51CTO專欄作者“朱國立”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號(hào)“開發(fā)者圓桌”獲取聯(lián)系和授權(quán)】