2009-07-20 107 views
54

MySQL如何存储varchar字段?我可以假设下面的图案表示明智储存大小:什么是MySQL的最佳varchar大小?

1,2,4,8,16,32,64,128,255(最大)

通过示例的澄清。可以说我有一个20个字符的varchar字段。 MySQL创建这个字段时,基本上保留了32字节的空间(不知道它们是否是字节),但只允许输入20个字节?

我想我很担心优化大型表的磁盘空间。

+7

我想指出的是,从MySQL 5.0.3开始,varchar可以高于65,535 – joshtronic 2011-02-25 18:37:58

回答

46

要回答这个问题,在磁盘上MySql使用1 +在字段中使用的大小来存储数据(所以如果列被声明为varchar(45),并且该字段是“FooBar”它将使用7字节在磁盘上,除非你使用多字节字符集的地方,它将使用14字节)。因此,无论您声明自己的列,它都不会在存储方面发挥重要作用(您表示担心磁盘优化会浪费大量表)。然而,它在查询中有所作为,因为当MySql创建一个临时表(SORT,ORDER等)时,VARCHAR被转换为CHAR,并且可以放入单个页面的记录越多,内存越少,表扫描速度越快是。

22

MySQL将varchar字段存储为可变长度记录,可以使用单字节或双字节前缀来指示记录大小。

拥有一种存储大小模式并没有真正改变MySQL在处理可变长度记录存储时的功能。在varchar(x)声明中指定的长度将简单地确定可以存储的数据的最大长度。基本上,varchar(16)与varchar(128)在磁盘上没有区别。

This manual page有更详细的解释。

编辑:关于您更新的问题,答案仍然相同。一个varchar字段只会在磁盘上占用你存储的数据空间(加上一个或两个字节的开销)。所以,如果你有一个varchar(16)或一个varchar(128)并不重要,如果你存储一个10个字符的字符串,你只会使用10个字节(加上1或2)的磁盘空间。

+30

实际上,明智地访问它会产生巨大的差异,因为当MySql在内存中创建结果集时,它会将其变成矩阵,因此如果您的最大的字段为16个字符,但该字段定义为128个字符,您必须为每行分配额外的112个字符。这浪费了很多回忆。 – 2009-07-20 05:22:36

+2

您不仅需要为内存中的每行分配额外的112个字符,而且每行迭代后还会有更多的L1缓存未命中。这与VARCHAR(16)列类型进行比较,您可以在该列中将更多行与此列一起挤入高速缓存中。 – 2017-02-08 21:13:00