【问题标题】:Memory usage of storing strings as varchar in MySQLMySQL中将字符串存储为varchar的内存使用情况
【发布时间】:2011-12-26 16:51:21
【问题描述】:

我开始对 MySQL 的内存使用非常感兴趣。所以我在这里看这个:

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

我对节省内存的前景感到非常兴奋(例如)只需要一个有符号的 smallint,而我在许多地方都使用了一个无符号的 int。然后我读到了 varchars...

“VARCHAR(M) - 如果列值需要 0 – 255 个字节,则长度 + 1 个字节”

什么?! 现在在我看来,存储单个 varchar 会占用如此多的内存,我什至可能对我的 int 与 smallint 不感到兴奋,因为它被大大掩盖了通过 varchar 字段。所以我来这里问这是不是真的,因为它根本不可能? varchars真的那么可怕吗?还是我真的不应该对我的 smallint 发现感到兴奋?

编辑:对不起!我应该更清楚。所以,假设我存储了一个包含 7 个字符的 varchar,即 8 个字节。那么,这意味着它使用与存储在 BIGINT 列中的数字相同的数字吗?这就是我所关心的。

【问题讨论】:

  • 您可能误解了文档。如果列值需要 0-255 个字节,其中 L - 是实际长度,则 Varchar(M) 需要 L+1。因此,如果列声明为varchar(255),latin1 字符集并包含'aaa',则存储长度为3+1 = 4。
  • varchar 存储您输入的字符数 + 一个字节来存储长度,如果您有一个 varchar(64) 字段并将字符串“世界和平”放入其中,该字段将占用 12 个字节(11 个用于字符串,1 个用于长度)。如果长度大于 255,则需要两个字节来存储它。另一方面,CHAR 列将始终占用分配给它们的大小(CHAR(16) 字段将始终占用 16 个字节,而 VARCHAR(16) 将仅占用 17 个字节,如果您放置一个 6 个字节长的字符串, 5个字节的字符串将占用6)。

标签: mysql database-design memory-management varchar mysql-management


【解决方案1】:

这就是说,对于给定的字符串长度,使用的存储量等于字符串的字节长度,加上一个字节来告诉 MySQL 字符串有多长。

例如,单词“automobile”是 10 个字节(每个字符 1 个),所以如果它存储在 varchar 列中,它将占用 11 个字节。数字 10 为 1,字符串中的每个字符为 1。

从您发布的链接中: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

存储要求取决于以下因素:

-列值的实际长度

-列的最大可能长度

-列使用的字符集,因为有些字符集包含多字节字符

例如,一个 VARCHAR(255) 列可以保存一个最大长度为 255 个字符的字符串。假设该列使用 latin1 字符集(每个字符一个字节),实际需要的存储是字符串的长度(L),加上一个字节来记录字符串的长度。对于字符串“abcd”,L 为 4,存储要求为 5 个字节。如果同一列改为使用 ucs2 双字节字符集,则存储要求为 10 个字节:'abcd' 的长度为 8 个字节,该列需要两个字节来存储长度,因为最大长度大于 255 (最多 510 个字节)。

【讨论】:

  • 最终编辑是人们需要阅读的内容,但我会接受这一点,因为它应该是彻底的。谢谢。
【解决方案2】:

虽然我不是 MySQL DBA,但对于这个问题似乎有一个非常简单的答案,无需深入了解存储大小 - 因为它不可配置。

每MySQL memory storage documentation,

MEMORY 表使用固定长度的行存储格式。 VARCHAR 等可变长度类型使用固定长度存储。

因此,无论 VARCHAR 如何存储在其他存储引擎(如 MyISAM 或 InnoDB)上,对使用 MEMORY 存储引擎的表使用 VARCHAR 都不会获得任何特定收益。

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2012-04-22
    相关资源
    最近更新 更多