數(shù)據(jù)庫(kù)管理-不同數(shù)據(jù)庫(kù)存儲(chǔ)容量差那么多?
最近客戶在和一些國(guó)產(chǎn)數(shù)據(jù)庫(kù)進(jìn)行試點(diǎn)測(cè)試,發(fā)現(xiàn)一個(gè)比較有趣的現(xiàn)象,即有些表數(shù)據(jù)在遷移前后,實(shí)際在磁盤(pán)中的存儲(chǔ)容量出現(xiàn)了2-3倍的增長(zhǎng),這點(diǎn)歸根結(jié)底得數(shù)據(jù)庫(kù)的研發(fā)來(lái)回答為什么會(huì)出現(xiàn)這一現(xiàn)象,但是我們今天也嘗試從一些蛛絲馬跡來(lái)推理一下。
1 數(shù)據(jù)類(lèi)型
由于我們這里運(yùn)維的Oracle數(shù)據(jù)庫(kù)都開(kāi)了擴(kuò)展varchar2長(zhǎng)度,即一個(gè)varchar2最大可存儲(chǔ)字節(jié)不是4000,而是32k,這樣使得很多原本超長(zhǎng)需要使用lob數(shù)據(jù)類(lèi)型的列可以繼續(xù)使用varchar2,也使得很多寫(xiě)成varchar2(xx char)的地方不再有超長(zhǎng)風(fēng)險(xiǎn)。
那么在很多其他數(shù)據(jù)庫(kù),使用varchar數(shù)據(jù)類(lèi)型(具體請(qǐng)查看各數(shù)據(jù)庫(kù)官方文檔)是滿足不了我這里實(shí)際數(shù)據(jù)的存儲(chǔ)需求的。那么在遷移過(guò)后就需要變換字段的數(shù)據(jù)類(lèi)型,在本次案例中,就出現(xiàn)了不少varchar轉(zhuǎn)換為text的操作。那么以MySQL為例對(duì)比一下varchar和text:
- varchar:一種可變長(zhǎng)度的字符串?dāng)?shù)據(jù)類(lèi)型,用于存儲(chǔ)可變長(zhǎng)度的字符數(shù)據(jù)。它的定義包括存儲(chǔ)支持的最大長(zhǎng)度,表示該列可以存儲(chǔ)的最大字節(jié)長(zhǎng)度。存儲(chǔ)方式與其長(zhǎng)度有關(guān)。當(dāng)存儲(chǔ)varchar值時(shí),MySQL會(huì)根據(jù)實(shí)際的數(shù)據(jù)長(zhǎng)度分配足夠的存儲(chǔ)空間。
- text:一種用于存儲(chǔ)大量文本數(shù)據(jù)的數(shù)據(jù)類(lèi)型。它可以存儲(chǔ)非常長(zhǎng)的字符串,最大長(zhǎng)度取決于數(shù)據(jù)庫(kù)的配置。總是占用足夠的存儲(chǔ)空間以容納其最大長(zhǎng)度。無(wú)論實(shí)際存儲(chǔ)的文本數(shù)據(jù)有多長(zhǎng),都會(huì)占用足夠的存儲(chǔ)空間。
那么從兩種數(shù)據(jù)類(lèi)型的對(duì)比來(lái)看,就可以知道使用text存儲(chǔ)字段占用的存儲(chǔ)空間肯定是大于varchar的。那么我們可以把這個(gè)當(dāng)做第一個(gè)可能的原因。
2 索引
這個(gè)問(wèn)題我也在群里問(wèn)過(guò)各位大佬,一位大佬說(shuō)了一句,他在使用一款和Oracle兼容性非常高的數(shù)據(jù)庫(kù)產(chǎn)品時(shí)候發(fā)現(xiàn),這個(gè)數(shù)據(jù)庫(kù)索引的存儲(chǔ)空間占用是大于Oracle數(shù)據(jù)庫(kù)中的索引。索引這個(gè)事情除了與上一節(jié)說(shuō)的數(shù)據(jù)類(lèi)型有關(guān),還與本身索引結(jié)構(gòu)的構(gòu)建有關(guān)系。這里可以當(dāng)做第二個(gè)可能的原因。
3 存儲(chǔ)引擎
其實(shí)結(jié)合上一點(diǎn),不同的數(shù)據(jù)庫(kù)有不同的存儲(chǔ)引擎,那么在數(shù)據(jù)塊的構(gòu)建上就可能千差萬(wàn)別,這個(gè)不僅僅體現(xiàn)在索引的存儲(chǔ)上,也體現(xiàn)在數(shù)據(jù)本身的存儲(chǔ)上。那么有些存儲(chǔ)引擎或者說(shuō)叫數(shù)據(jù)存儲(chǔ)的樹(shù)形結(jié)構(gòu)從理論層面是可以節(jié)省存儲(chǔ)空間的,而有些確實(shí)會(huì)占用更多空間。這里當(dāng)作第三個(gè)可能的原因。
總結(jié)
這里并沒(méi)有說(shuō)具體數(shù)據(jù)庫(kù)之間的存儲(chǔ)差異,說(shuō)真的也不大敢得罪任意一家數(shù)據(jù)庫(kù),我也希望大家在做國(guó)產(chǎn)數(shù)據(jù)庫(kù)選型、測(cè)試的時(shí)候可以考慮的更全面一點(diǎn)。還可能有哪些原因也希望大家留言、私信補(bǔ)充。
老規(guī)矩,不知道寫(xiě)了些啥。