我们有一些MySQL表包含100,000到10,000,000条记录。有些字段是VARCHAR(100),实际上没有条目超过11个字符。
显然,我们正在使用更多的空间然后我们应该......如果百万记录表的一个VARCHAR(100)字段使用100MB的空间,那么我们可能浪费多达几GB的空间。 / p>
如果我们要简化这些表,并将VARCHAR字段缩小到适当的大小,它是否会帮助我们提供更多的存储空间?它可能会改善查询的查找时间吗?
答案 0 :(得分:1)
我不知道mysql实现的细节,但我确实知道关系数据库的典型实现,并且在该实现中它确实有帮助。
通常,记录连续存储在称为RID表的文件中。 RID表中的记录号(使用基于零的计数)乘以记录大小是记录文件存储位置的偏移量。
如果记录大小较小,则RID表中的更多记录适合从磁盘获取的磁盘扇区,并且更多记录适合内存。
即使使用不同的实现,较小的记录缓冲区也允许将更多记录缓存在内存中,这可以减少磁盘访问次数。
答案 1 :(得分:1)
从Data type storage requirements的MySQL文档开始,varchar类型存储值如下:
如果列值需要0 - 255个字节,则为L + 1个字节;如果值可能需要超过255个字节,则为L + 2个字节,其中L表示给定字符串值的实际长度(以字节为单位) 的
在我看来,如果你的计划是将类型从VARCHAR(100)更改为VARCHAR(11),它将不会影响查询性能,因为MySQL已经将值存储在其“最佳”上。
如果您有一个CHAR(100)类型,那么少于100个字符的字符串将被填充空格,在这种情况下,您将占用空间不足,我认为查询性能也很差。
参考文档,CHAR类型的长度是:
M×w字节,0 <= M <= 255,其中w是字符集中最大长度字符所需的字节数,其中M表示声明的列长度,以字符为单位 的
但如果你的所有记录都有固定长度11,你应该使用CHAR(11),它将改善查询的存储和性能。
关于字符串存储的另一个重点是指char集,如文档中所述:
要计算用于存储特定CHAR,VARCHAR或TEXT列值的字节数,必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,在使用utf8 Unicode字符集时,必须记住并非所有字符都使用相同的字节数,并且每个字符最多可能需要三个字节。 的
希望它有所帮助!