看了新公司的数据库设计,有些问题思考了一下,写这篇文章也就记录这个问题的思考过程。
首先从占用空间进行比较,varchar(10) 声明10个字节,数据保存时额外一个字节的长度前缀;varchar(1000)声明1000个字节,如果数据长度大于255,长度前缀是两个字节。而实际Varchar数据类型是根据实际的需要来分配长度的。有问题的参考这篇文章,挺有意思的一个实验,关于varchar的思考。
那么,既然主要关心磁盘占用没有问题,哪里可能出现问题
![y6r5ep3gwy.jpeg](https://i-blog.csdnimg.cn/blog_migrate/8b7a04efdcc7a8251d2b701a9ff72579.jpeg)
![dh21hnmfxo.jpeg](https://i-blog.csdnimg.cn/blog_migrate/c9b5e529b53d0fb08ff3edda603d3a29.jpeg)
意思就是说对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即1000个字符空间,因为其会转换成CHAR。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。解释可以参见这里。
(https://stackoverflow.com/questions/1151667/what-are-the-optimum-varchar-sizes-for-mysql)。
所以我们在做库表设计的时候,一些大字段参数进行业务拆表,还有就是数据库设计时候varchar(n)这个字段要合理,不能太大。
这边再贴一下这个过程中发现的一篇有趣的帖子,是关于char和varchar的
http://tech.it168.com/a2011/0426/1183/000001183173.shtmlmysql存储代码类型