有没有人知道使用VarChar(255)和VarChar(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和数据列中搜索
这是一个关于存储性能的简单问题,而不是索引或搜索性能......
答案 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仅为您输入的字符使用空格。