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























