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