行存儲(chǔ)
我們常用的關(guān)系型數(shù)據(jù)庫(kù)mysql,oracle等都是基于行存儲(chǔ)薄翅,以最常用的mysql數(shù)據(jù)庫(kù) innodb引擎為例,見(jiàn)下圖
多個(gè)連續(xù)的行記錄沙兰,組成一個(gè)data page(大小16k)虑省,然后按照B+樹(shù)的結(jié)構(gòu)進(jìn)行組織存儲(chǔ)。
這種存儲(chǔ)模式適用于OLTP的業(yè)務(wù)場(chǎng)景
- 一行記錄的所有列連續(xù)存儲(chǔ)僧凰,一次IO可以實(shí)現(xiàn)整行讀取或者寫(xiě)入探颈,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的ACID特性就比較簡(jiǎn)單。
- OLTP常見(jiàn)的業(yè)務(wù)場(chǎng)景训措,點(diǎn)查詢伪节,點(diǎn)更新等
select c1,c2,c3 from table where id =xxx;
update table set c1=xxx,c2=xxx where id = xxx;
由于B+樹(shù)的邏輯結(jié)構(gòu),千萬(wàn)級(jí)別數(shù)據(jù)量最少3次IO可返回結(jié)果绩鸣。
列存儲(chǔ)
隨著數(shù)據(jù)量的膨脹(億數(shù)量級(jí))以及在線分析業(yè)務(wù)OLAP的發(fā)展怀大,基于行存儲(chǔ)的mysql等關(guān)系型數(shù)據(jù)庫(kù)就開(kāi)始力不從心了,基于列存儲(chǔ)的數(shù)據(jù)庫(kù)產(chǎn)品就開(kāi)始登場(chǎng)呀闻。
如圖化借,數(shù)據(jù)按列進(jìn)行存儲(chǔ)。
行存和列存在以下關(guān)鍵點(diǎn)上有極大差異
- IO放大問(wèn)題
OLAP大多是對(duì)某一列或幾列數(shù)據(jù)的一個(gè)聚合分析捡多,比如找出年齡在18-30歲之間的人的userid 蓖康,如果是傳統(tǒng)的行存儲(chǔ)模式,即使在年齡上有索引垒手,那么在回表查詢的時(shí)候蒜焊,也會(huì)不得不將符合條件記錄的所有列(userid之外的姓名,性別...)都讀出來(lái)科贬。這就會(huì)造成IO放大泳梆,當(dāng)數(shù)據(jù)量在億級(jí)別的時(shí)候,這就很影響性能了榜掌,列存儲(chǔ)就規(guī)避了這一點(diǎn)优妙。 - 數(shù)據(jù)壓縮問(wèn)題
同一列的數(shù)據(jù),數(shù)據(jù)類型一致憎账,列存的模式下就適合數(shù)據(jù)壓縮套硼,不同的列可以采用不同的壓縮算法,壓縮存儲(chǔ)就會(huì)帶來(lái)IO性能的提升鼠哥。 - 事務(wù)ACID問(wèn)題
行存儲(chǔ)熟菲,一條記錄一次IO寫(xiě)入看政,那么保證事務(wù)特性就很簡(jiǎn)單朴恳。
列存儲(chǔ),一條記錄拆分成多次IO進(jìn)行列寫(xiě)入允蚣,那么就比較難實(shí)驗(yàn)事務(wù)特性于颖。
這樣的差異造成,OLAP場(chǎng)景很適合采用列存儲(chǔ)嚷兔,但是反過(guò)來(lái)森渐,在OLTP場(chǎng)景做入,列存儲(chǔ)又無(wú)能為力了。比如對(duì)某一條記錄的寫(xiě)入或者修改同衣,行存儲(chǔ)一次IO搞定竟块,可以保證數(shù)據(jù)的完整性,但是列存儲(chǔ)就要將一條行記錄的寫(xiě)入拆成多次的列記錄寫(xiě)入耐齐,這就帶來(lái)了寫(xiě)入IO的性能問(wèn)題浪秘。
基于以上行存和列存的特性,在實(shí)際業(yè)務(wù)中,我們的OLTP系統(tǒng)一般是采用基于行存的數(shù)據(jù)庫(kù)產(chǎn)品,像mysql oracle等术浪,然后將業(yè)務(wù)數(shù)據(jù)離線導(dǎo)入到基于列存的產(chǎn)品办成,進(jìn)行后續(xù)的分析,這種模式的實(shí)時(shí)性是很差的戏仓,一般用于分析T-1的離線數(shù)據(jù),如果有需求要實(shí)時(shí)分析在業(yè)務(wù)系統(tǒng)中實(shí)時(shí)產(chǎn)生的數(shù)據(jù),這種模式就無(wú)法滿足了沟沙,那么有沒(méi)有既能滿足OLTP的寫(xiě)入性能要求,又能滿足OLAP的分析性能要求的存儲(chǔ)結(jié)構(gòu)呢?答案是肯定的壁榕。
行列混合存儲(chǔ)
阿里的AnalyticDB就是采用行列混合存儲(chǔ)的產(chǎn)品
如圖所示尝胆,AnalyticDB將30720條記錄定義為一個(gè)block,數(shù)據(jù)在block中的某一列护桦,是按列存儲(chǔ)的含衔。同一block的不同列,又是連續(xù)存儲(chǔ)的二庵。在行列混存的模式下
- 多列寫(xiě)入 贪染,列存模式的隨機(jī)寫(xiě)變成順序?qū)?/li>
- OLTP明細(xì)查詢,select 多列由列存的隨機(jī)讀催享,變成了block內(nèi)的順序讀
- OLAP多維分析杭隙,將隨機(jī)讀變成順序讀
基于行列混合存儲(chǔ)的特性,配合倒排索引因妙,bitmap索引痰憎,范圍索引,預(yù)排序攀涵、各種的Cache機(jī)制铣耘、讀寫(xiě)分離等。AnalyticDB做到了既滿足大批量高性能寫(xiě)入以故、又滿足千億量級(jí)數(shù)據(jù)實(shí)時(shí)分析毫秒級(jí)別響應(yīng)蜗细,很適合大數(shù)據(jù)量實(shí)時(shí)寫(xiě)入,實(shí)時(shí)分析的場(chǎng)景。
最后:阿里B2B廣告團(tuán)隊(duì)招人炉媒,java踪区,數(shù)據(jù)工程,數(shù)據(jù)挖掘吊骤,base可選北京杭州缎岗。有意者丟簡(jiǎn)歷過(guò)來(lái)
hengyi.wzw@alibaba-inc.com