-1

我们有一些包含 100,000 到 10,000,000 条记录的 MySQL 表。有些字段是 VARCHAR(100),而实际上没有条目超过 11 个字符。

显然,我们正在使用更多的空间,那么我们应该...

如果我们要精简这些表,并将 VARCHAR 字段减少到适当的大小,它对我们的帮助不仅仅是存储空间吗?它可能会改善查询的查找时间吗?

4

2 回答 2

1

我不知道 mysql 实现的细节,但我知道关系数据库的典型实现,并且在那个实现中它确实有帮助。

通常,记录连续存储在称为 RID 表的文件中。RID 表中的记录号(使用基于零的计数)乘以记录大小是文件中存储记录的位置的偏移量。

如果记录大小较小,则 RID 表中的更多记录适合从磁盘获取的磁盘扇区,并且更多记录适合内存。

即使使用不同的实现,较小的记录缓冲区也允许在内存中缓存更多记录,这可以减少磁盘访问次数。

于 2013-03-21T16:11:13.487 回答
1

从 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、VARCHAR 或 TEXT 列值的字节数,您必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,在使用 utf8 Unicode 字符集时,您必须记住,并非所有字符都使用相同的字节数,每个字符最多需要三个字节。

希望能帮助到你!

于 2013-03-21T17:05:03.340 回答