看了新公司的数据库设计,有些问题思考了一下,写这篇文章也就记录这个问题的思考过程。

首先从占用空间进行比较,varchar(10) 声明10个字节,数据保存时额外一个字节的长度前缀;varchar(1000)声明1000个字节,如果数据长度大于255,长度前缀是两个字节。而实际Varchar数据类型是根据实际的需要来分配长度的。有问题的参考这篇文章,挺有意思的一个实验,关于varchar的思考。

具体计算方式参考下面帖子()

那么,既然主要关心磁盘占用没有问题,哪里可能出现问题

意思就是说对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即1000个字符空间,因为其会转换成CHAR。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。解释可以参见这里。

(-are-the-optimum-varchar-sizes-for-mysql)。

所以我们在做库表设计的时候,一些大字段参数进行业务拆表,还有就是数据库设计时候varchar(n)这个字段要合理,不能太大。

这边再贴一下这个过程中发现的一篇有趣的帖子,是关于char和varchar的