mysql在建立表的時候定義表的性質,共有三種:靜態表,動態表,壓縮表。默認是靜態表,若是存在varchar、blob、text字段,表類型就是動態了。
1.靜態表:
字段有固定長度,例如:char(20)。若是使用gbk字符集存儲中文username,將佔用40byte,若是username的實際內容沒有達到40byte,將會填充空格,以達到40byte。速度很快,由於mysql知道username老是從第41個字節開始,容易緩存,出現問題後也容易恢復(mysql知道記錄的確切位置),須要更多的硬盤空間(若是有三個上面的字段,一條記錄就會佔120字節,即便實際只用了其中一部分)
2.動態表:
字段不定長(變長),這種表格式比較節省空間,可是複雜度更高,每條記錄都有一個header,做用就是代表該記錄有多長,全部的字符串列都是動態的(除非小於4個字節,這種狀況下,節省的空間能夠忽略不計,增長的複雜度會反而會致使性能丟失),一般佔用比靜態表少的多地空間,可是必須常常維護(避免碎片),例如:更新了用戶名somebody爲somebodyt,t不能馬上就出如今y的後面,由於空間被其餘記錄佔用,對於出現碎片的列,每一個新鏈接會損失6個字節。並且出現問題後不容易重建(前面我說的靜態表正好相反),若是碎片嚴重,有可能出現庫爆炸(^_^).
不包括鏈接的動態記錄的空間消耗能夠用下面的公式計算:
3+(列數+7)/8+(字符列數)+數字列的打包尺寸+字符串長度+(空列的數量+7)/8
每條記錄的header能夠代表那個字符串列是空的,那個數字列包含0(非空),在那種狀況下不向磁盤存儲,非空字符串包含一個長度字節加上字符串內容。
壓縮表:
只讀,使用不多的空間,用myisampack工具建立,表要少得多,每條記錄分開壓縮,因此不能同時訪問,能夠壓縮靜態表和動態表。
建立方法:myisampack [options] filename
你大致上能夠看出來,具體的計算空間不容易,只要根據不一樣的表特色選擇數據庫就能夠了。mysql