2012-07-18 59 views
1

正如文档所说,mysql不会分配您为varchar指定的完整空间。它存储实际的数据长度。所以我猜这里可能还有副作用。就像一个varchar记录的原始长度是10,现在我想将它更新为20,但仍然没有达到指定的限制50.但是,之前分配的空间是不够的。 所以我的问题是MySQL如何处理这种情况?移动该记录后的所有内容需要很长时间?还是它必须这样做? 有没有人可以告诉我它是如何在内部工作的?提前致谢!使用varchar(x)有什么危害?

+1

相信我,关于磁盘存储优化,关系数据库在过去的40年中走过了很长的路要走。不要为了小东西而流汗。 – Olaf 2012-07-18 19:23:31

回答

1

MySQL处理得很好,你不应该关心细节。尽管长度不规则的记录比固定长度的记录管理起来要慢一些,但是如果记录通常小于固定大小,那么通过读取显着更少的数据会带来巨大的性能提升。

请记住,CHAR列总是以最大大小存储和检索。即使平均记录只有10-15字节的数据,255个字符的字段也需要传输255个字节。这是相当大的开销。

使用CHAR提出了一系列其他问题,因为该字段将始终为该长度,这意味着它必须完整地传输并且通常在客户端中被剥离。这比麻烦更麻烦。

CHAR列在现代唯一使用的是用于总是定义的东西,并且将始终是一定的大小。一个例子可能是使用40个字符的十六进制编码哈希值作为标识符,但这些通常很少见,几乎在所有情况下,VARCHAR也可以工作。

+0

我可以想到几个可以使用'char'的例子 - 电话号码,电话号码,国家保险号码等等。但对于大多数情况'varchar'更好。 – 2012-07-18 20:42:27

+0

即使在国家内,邮政编码的长度也会有很大差异,电话号码可能会有扩展名,等等。如果你曾经敢于假设*某种特定的固定长度,你通常会感到惊讶。我希望你不是用'CHAR(5)'邮政编码字段创建数据库,因为我之前就已经看到过,而且它已经超越了真气。 – tadman 2012-07-19 11:27:08

相关问题