2011-10-05 113 views
9

快速的问题。如果我将使用十进制字段限制或十六进制(比如说16,32,64而不是10,20,50),那么从存储数据的角度来讲,这是否重要?是varchar(128)比varchar(100)更好

我问,因为我想知道这是否会与硬盘上的群集有任何关系?

谢谢!

+2

这是一个特定的RDBMS或一般的问题吗? –

+0

你打算将十进制数据存储在varchar字段中吗? –

+0

ypercube:mysql,InnoDB Tudor:不,只有文本...除非文本是数字:) – RandomWhiteTrash

回答

9

如果您需要存储超过100个字节的字符串,则VARCHAR(128)优于VARCHAR(100)。

否则,他们之间的选择很少;你应该选择一个更适合你可能需要存储的数据的最大长度的那个。您将无法衡量它们之间的性能差异。除此之外,数据库管理系统可能只存储你发送的数据,所以如果你的平均字符串是16字节,它将只使用16个字节(或者更可能是17个字节 - 允许1个字节来存储长度) 。较大的尺寸可能会影响有多少行可以适合页面的计算 - 不利的。因此,选择足够的最小尺寸是合理的 - 不要浪费,不要。

总而言之,两者在性能或磁盘使用方面存在着微小的差异,并且与方便的二进制边界对齐并没有真正的区别。

2

是的,但并不那么简单。有时候128可以比100好,有时候也是相反的。

那么是怎么回事? varchar仅根据需要分配空间,因此如果您将hello world存储在varchar(100)中,则它将占用与varchar(128)中的空间完全相同的空间量。

现在的问题是:如果你填满行,你会达到一个“块”的限制/边界或不?

数据库将数据存储在块中。它们具有固定大小,例如512(可以为某些数据库配置此值)。所以问题是:数据库必须读取多少个块才能获取每一行?跨越多个块的行将需要更多的I/O,所以这会减慢你的速度。

但是,这并不取决于列的理论最大尺寸,而是a)您有多少列(每列需要一点空间,即使它是空的或null),b)多少固定宽度的列(number/decimal,char),最后c)在变量列中有多少数据。

3

如果这将是一个C程序,我也会花一些时间考虑一下。但是对于数据库,我会把它留给数据库引擎。

DB程序员花了很多时间思考最佳内存布局,所以只需告诉数据库你需要什么,它将以最适合数据库引擎(通常)的方式存储数据。

如果要对齐你的数据,你需要的内部数据组织确切知识:如何存储的字符串?一个,两个或四个字节来存储长度?它以纯字节序列存储还是以UTF-8 UTF-16 UTF-32编码?数据库是否需要额外的字节来识别NULL或> MAXINT值?也许该字符串存储为NUL终止的字节序列 - 然后在内部需要多一个字节。

此外,使用VARCHAR它不是必需的,数据库将始终为您的字符串分配100(128)个字节。也许它只存储一个指向实际数据空间的指针。

所以我强烈建议使用VARCHAR(100),如果这是你的要求。如果DB决定以某种方式对齐,那么也有额外的内部数据空间。

其他解决方法:让我们假设您使用VARCHAR(128)并且所有内容都一起使用:数据库为您的数据分配128个字节。此外,它还需要2个字节来存储实际的字符串长度 - 使得130个字节 - 然后可能是数据库将数据与下一个(比方说32字节)边界对齐:磁盘上所需的实际数据现在为160个字节8-}