我在一些示例数据库中看到,人们喜欢将字段大小舍入为基数2的倍数(例如varchar(32)或varchar(64)),就好像它为它们提供了更好的性能或空间利用率。这种做法有什么好处吗?或者这只是人们迂腐?
感谢您的关注
答案 0 :(得分:14)
在MySQL中,长度应该总是255或65,535(除非有特定类型的原因选择不同的长度)。存储字符串有两种不同的方法。对于长度不超过255,长度存储在一个字节而不是两个字节中,从而节省了一个存储字节。
在varchar
中,长度是最大长度。值根据实际长度存储在页面上。因此,最大长度不会影响其他任何内容的存储,除了1或2字节长度(取决于最大值是< = 255还是> = 256)。 (长度为2的幂 - 除256之外 - 对存储没有影响。)
将长度设为2的幂。我在很多场合都对此感到内疚。这是一种习惯,希望保持字段在字节边界上对齐。我们的想法是保持字段在4或8字节边界上对齐,因为这对CPU来说更为理想(想想“C”编程语言)。当整数或浮点值需要4或8字节对齐(因此会丢失一些字节)或将字节从未对齐空间复制到对齐空间时,这可以防止不必要的空间。当然,正如我刚才所说,这个逻辑没有数据库的基础,因为最大长度不影响页面上的实际存储。
这个没有意义的另一个原因是varchar
类型实际上比长度存储了一个或两个字节。数据库负责从页面上的物理格式到内存中的物理格式的转换。试图“优化”这个过程比付出更多的努力。
答案 1 :(得分:1)
信不信由它有效。在我自己验证之前,我不相信。我在两个表中构建了一个包含两个字段的数据库,这两个表都是索引的,并且加载了大量数据。一个字段是VARCHAR(100),另一个字段是VARCHAR(256)。
查询表时,256的字段表现得更好。
这个工作的原因是因为读取磁盘时的块大小,它匹配,所以它不是一次读取部分块。