快速问答。从存储数据的角度来看,如果我将使用十进制字段限制或十六进制(例如16,32,64而不是10,20,50),这有关系吗?
我之所以这样问,是因为我想知道这是否会与硬盘上的集群有关?
谢谢!
发布于 2011-10-05 15:37:22
如果需要存储长度超过100字节的字符串,则VARCHAR(128)比VARCHAR(100)更好。
否则,在它们之间几乎没有选择;您应该选择更适合您可能需要存储的最大数据长度的一个。您将无法测量它们之间的性能差异。除此之外,DBMS可能只存储您发送的数据,因此,如果您的平均字符串是16字节,那么它在磁盘上只使用16字节(或者,更有可能是17字节-允许1字节来存储长度)。较大的大小可能会影响一页上可以容纳多少行的计算-这是有害的。因此,选择合适的最小尺寸是有意义的-不浪费,不想要。
因此,总而言之,两者在性能或磁盘使用方面几乎没有什么不同,对齐到方便的二进制边界实际上并没有什么不同。
发布于 2011-10-05 16:00:41
如果它是一个C程序,我也会花一些时间来考虑这一点。但是有了数据库,我就把它留给了DB引擎。
DB程序员花费了大量时间来考虑最佳的内存布局,所以只要告诉数据库您需要什么,它就会以最适合DB引擎的方式(通常)存储数据。
如果想要对齐数据,则需要对内部数据组织有准确的了解:字符串是如何存储的?一个、两个或四个字节来存储长度?它是以普通字节序列存储还是以UTF-8 UTF-16 UTF-32编码?DB是否需要额外的字节来标识NULL或>MAXINT值?也许字符串是以NUL结尾的字节序列存储的--然后在内部还需要一个字节。
同样,对于VARCHAR,它不一定是真的,DB将总是为您的字符串分配100 (128)字节。也许它只存储一个指针,指向实际数据所在的空间。
因此,如果您需要的话,我强烈建议您使用VARCHAR(100)。如果数据库决定以某种方式对齐,那么也有空间存储额外的内部数据。
换句话说:假设您使用的是VARCHAR( 128 ),所有的东西都在一起: DB为您的数据分配了128字节。此外,它还需要2个字节来存储实际的字符串长度- 130个字节-然后DB可能会将数据对齐到下一个边界(假设32个字节):磁盘上需要的实际数据现在是160个字节8-}
发布于 2011-10-05 15:38:13
是的,但并不是那么简单。有时128比100更好,有时正好相反。
那么到底是怎么回事呢?varchar只在必要时分配空间,所以如果您将hello world存储在varchar(100)中,它将占用与varchar(128)中完全相同的空间量。
问题是:如果你填满了行,你是否会达到一个“块”的限制/边界?
数据库将其数据存储在块中。它们具有固定的大小,例如512 (可以为某些数据库配置此值)。所以问题是:数据库必须读取多少个块才能读取每行?跨多个块的行将需要更多的I/O,因此这将减慢您的速度。
但同样:这不取决于列的理论最大大小,而取决于a)您有多少列(每列需要一点空间,即使它是空的或null的),b)您有多少固定宽度的列(number/decimal,char),最后c)您在可变列中有多少数据。
https://stackoverflow.com/questions/7657987
复制相似问题