VarChar(255)和VarChar(65536)之间的MySQL不同处理

时间:2011-05-05 13:57:39

标签: mysql varchar

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

这是我目前所知道的:

  • VarChar(255)仅使用一个字节的大小
  • VarChar(65536)将使用两个字节作为大小
  • VarChar(65536)仅在MySQL 5.0.3
  • 之后才存在
  • MySQL使用255和65536之间的不同处理(虽然不知道区别)

我不确定这些varchars之间是否有任何性能差异。

假设我想创建一个包含多种行的表。 使用带有'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)

在键入== data_type2?

时仅使用'data'列

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

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

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

编辑:

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

编辑2:

我不打算在msg和数据列中搜索

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

2 个答案:

答案 0 :(得分:25)

你提到了一些真实的事情,我将解释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),因此需要使用两个字节。两个为16 = 65536的幂,这意味着你可以存储任何大小为该大小的字符串,然后它会加起来2个字节来表示字符串的长度。

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

了解这些信息可能有助于您确定最适合使用的信息。

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

答案 1 :(得分:-1)

IMO最好使用VARCHAR而不是任何其他字符串类型,因为TEXT具有大小限制并且CHAR在磁盘上保留空间。 VARCHAR仅为您输入的字符使用空格。