【问题标题】:MySQL different treatment between VarChar(255) and VarChar(65536)MySQL VarChar(255) 和 VarChar(65536) 之间的不同处理
【发布时间】:2011-08-19 10:13:38
【问题描述】:

有人知道使用 VarChar(255) 和 VarChar(65536) 的区别吗?

这是我目前所知道的:

  • VarChar(255) 将只使用一个字节来表示大小
  • VarChar(65536) 将使用两个字节来表示大小
  • VarChar(65536) 仅从 MySQL 5.0.3 开始存在
  • MySQL 在 255 和 65536 之间使用不同的处理方式(虽然不知道有什么区别)

我不确定这些 varchar 之间是否存在任何性能差异。

假设我想创建一个包含多种行的表。 使用带有 'data_type1' 和 'data_type2' 的枚举

data_type1 在 varchar 中永远不会超过 255 个字符 data_type2 在 varchar 中的字符数大多超过 255 个

哪个解表会更好?

id (int) - autoincrement
type (enum : data_type1, data_type2)
msg (varchar(255))
data (TEXT)

在 type == data_type2 时仅使用“数据”列?

id (int) - autoincrement
type (enum : data_type1, data_type2)
msg (varchar(65536))

使用 'msg' 列,无论存在什么类型?

两种解决方案实际上都需要类型列以用于治疗目的。

编辑:

当 type == data_type2 时,存储的数据实际上永远不会超过 10000 个字符

编辑 2:

我不想在 msg 和 data 列中搜索

这是一个关于存储性能的简单问题,而不是索引或搜索性能...

【问题讨论】:

  • 我真的不明白你在问什么。
  • 我想,简而言之,我的问题是:在 1 和 2 之间哪个表更好,用于存储 2 种大小不同的数据类型
  • 语义上,版本 2。
  • 是的,我想是的,这就是我写它的原因,但如果解决方案 1 获取速度更快,谁在乎语义 ;)
  • 我愿意!此外,它可能不是。无论如何,它不会成为你的瓶颈。如果您真的在乎,请对其进行描述。否则,只需编写它并继续做更重要的事情。

标签: mysql varchar


【解决方案1】:

您提到了一些真实的事情,我将解释 VARCHAR 的工作原理。

如果您指定 VARCHAR(60),这意味着它最多可以容纳 60 个字符。如果它包含较少的字符,比如说 50 - 那么 MySQL 使用 50 个字节而不是 60 个字节来存储数据。

与 CHAR(60) 完全相反 - 它保留 60 个字节,而不管您要保存的字符串的长度。

现在,VARCHAR 是如何工作的?如果将其指定为 VARCHAR(255),则意味着该列将保留 1 个字节 + 字符串字节的长度。 那 1 个字节表示字符串的长度。 1 个字节 = 您可以存储 0 - 255 个值(2 的 8 次方 = 256)。

对于大于 255 的 VARCHAR,您需要以某种方式存储正在使用的字节数。由于 1 个字节最多只能存储 256 个不同的值(0 - 255),因此您需要使用两个字节。 2 的 16 次方 = 65536,这意味着您可以存储不超过该大小的任何字符串,然后将 2 个字节相加来表示字符串的长度。

因此,简而言之 - 性能差异在于,如果您有 VARCHAR(65536) 并且使用 200 个字节来存储文本 - 您正在浪费 VARCHAR(65536) 将使用的 1 个额外字节。 有人可能会想“哦,但这只是 1 个字节,谁在乎呢”。很多人实际上是这样做的——想象在一个有 5000 万条记录的表上有几个 VARCHAR 列。假设您有 3 个 varchar 列,每个列都浪费了额外的字节——即 3 个字节 * 5000 万〜 144 兆字节的浪费空间。有趣的是,这不仅仅是浪费空间。当您想读取某些内容时,它还有助于处理开销和使用额外的 RAM。 谁说你的数据库中只有一张表会变大?

了解这些信息可能会帮助您决定最好使用什么。

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html 如果您之前没有检查过,它会解释每种数据类型是如何存储的以及它需要多少空间。

【讨论】:

  • 如果我正在获取 data_type1 ,将 TEXT 字段设置为 NULL 不会减慢速度吗?获得 varchar(65536) 或 TEXT 是否会一样快?
  • 这里的差异可以忽略不计,您正在谈论找到该行后 retrieving 的性能,但您完全忘记了 finding 该行你想找回。就规模而言,您在错误的竞争环境中进行了优化。你到底在做什么?这听起来像是您偶然发现的强类型 EAV 数据模型,您能否澄清一下,以便我可以指出正确的方向?
  • 其实我担心的是这个表会被查询很多!行生命周期非常简单,INSERT-SELECT-DELETE(实际上是一个队列)。现在我们面临每个动作(300k 插入,300k 选择,300k 删除)/小时的 300K/小时。我当然希望在添加和删除方面有最好的性能以及选择(但选择并不是我真正担心的)
  • 您使用的是什么数据库引擎?如果它是 InnoDB,那么如果您的 DELETE 和 SELECT 是基于主键查找(WHERE id = 123),那么 InnoDB 将非常快,并且 varchar / text 的数据类型不会在那里产生影响。如果是 MyISAM,那么 INSERT 将像公式 1 一样快,但其他位可能会崩溃,而基于主键的 SELECT 将比基于 InnoDB 的 SELECT 慢得多。
  • 它是带有主键查找的 InnoDB。所以我想我什么都不担心......我会看到当我完成;)谢谢
【解决方案2】:

IMO 最好使用 VARCHAR 而非任何其他字符串类型,因为 TEXT 有大小限制,而 CHAR 保留磁盘空间。 VARCHAR 只为您输入的字符使用空格。

【讨论】:

  • 对不起,这不是真的,你有错误的信息。 CHAR 确实会“保留”空间,TEXT 不会,它类似于 VARCHAR 的工作方式。
  • 这意味着如果我使用字段类型 TEXT 并存储 300 个字符的值,TEXT 是否适合这个大小?或者,我会浪费一些空间?
  • 旧线程,但看到这个并想我会发表评论。 varchartext 之间的唯一区别是可以存储的最大数据量。 varchar(max) - 可变宽度字符串 - 最大大小 1,073,741,824 个字符 text - 可变宽度字符串 - 2GB 文本数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多