14

我在一些示例数据库中看到人们喜欢将字段大小四舍五入到以 2 为底的数字的倍数(例如 varchar(32) 或 varchar(64) ),就好像这可以为他们提供更好的性能或空间利用率。这种做法有什么好处吗?还是这只是人们迂腐?

感谢您的关注

4

2 回答 2

17

在 MySQL 中,长度实际上应该始终为 255 或 65,535(除非有特定类型的原因选择不同的长度)。有两种不同的方式来存储字符串。对于高达 255 的长度,长度存储在一个字节而不是两个字节中,从而节省了一个字节的存储空间。

在 avarchar中,长度是最大长度。值根据其实际长度存储在页面上。因此,最大长度不会影响其他任何内容的存储,除了 1 字节或 2 字节长度(取决于最大值是 <= 255 还是 >= 256)。(长度为 2 的幂 - 256 除外 - 对存储没有影响。)

至于将长度设置为 2 的幂。我在很多场合都为此感到内疚。希望保持字段在字节边界上对齐是一种旧习惯。这个想法是保持字段在 4 或 8 字节边界上对齐,因为这对 CPU 来说更优化(想想“C”编程语言)。当整数或浮点值需要 4 或 8 字节对齐(因此会丢失一些字节)或将字节从未对齐空间复制到对齐空间时,这可以防止不必要的空间。当然,正如我刚才所说,这个逻辑没有数据库的基础,因为最大长度不会影响页面上的实际存储。

这没有意义的另一个原因是该varchar类型实际上存储了比长度多一个或两个字节。数据库负责将页面上的物理格式转换为内存中的物理格式。试图“优化”这个过程比它值得付出更多的努力。

于 2013-08-05T02:38:01.983 回答
0

信不信由你。直到我自己验证了它,我才相信它。我在两个表中构建了一个包含两个字段的数据库,两个表都被索引,并加载了完整的数据。一个字段是 VARCHAR(100),另一个是 VARCHAR(256)。

查询表时,256 的字段表现更好。

之所以可行,是因为读取磁盘时的块大小,它匹配,所以它不是一次读取部分块。

于 2013-08-05T02:33:45.247 回答