MySQL的最佳varchar大小是多少?


67

MySQL如何存储varchar字段?我可以假设以下模式代表合理的存储大小:

1,2,4,8,16,32,64,128,255(最大)

通过示例进行说明。可以说我有20个字符的varchar字段。MySQL在创建此字段时是否基本上保留32个字节的空间(不确定是否为字节),但只允许输入20个字节?

我想我担心优化大型表的磁盘空间。


7
我想指出,自MySQL 5.0.3起,varchar可以超过65,535
joshtronic 2011年

Answers:


59

为了回答这个问题,在磁盘上MySql使用1 +字段中用于存储数据的大小(因此,如果将该列声明为varchar(45),并且该字段为“ FooBar”,则它将在磁盘上使用7个字节,除非您当然使用多字节字符集,否则将使用14个字节)。因此,尽管您声明了列,但不会在存储端有所作为(您说过您担心大型表的磁盘优化)。但是,它确实在查询中有所不同,因为当MySql创建临时表(SORT,ORDER等)时,VARCHAR转换为CHAR,并且可以在单个页面中容纳的记录越多,表扫描所需要的内存越少且速度越快是。


嗯?因此,在多字节字符集上,它是((size)+ 2)?
andyk

4
不,在多字节是(大小* 2)+ 1
克里斯埃里克森

3
@Kris:我相信它也可以是(尺寸* 3)+ 1甚至(尺寸* 4)+ 1,不是吗?
Alix Axel 2010年

2
关于多字节的声明非常容易引起误解。UTF-8是一种多字节字符编码,但是对于ASCII和Latin1字符(UTF8的前256个字符),您将具有一个字节一字符的对应关系。UTF-16仅对基本多语言平面中的代码点使用每个代码点2个字节。
安诺

1
如果该尺寸超过255个,应大小所需的总空间* N + 2
Wizist

24

MySQL将varchar字段存储为可变长度记录,并以一字节或两字节为前缀来指示记录大小。

拥有存储大小模式并不会真正改变MySQL处理可变长度记录存储的方式。在varchar(x)声明中指定的长度将仅确定可以存储的数据的最大长度。基本上,varchar(16)在磁盘方向上与varchar(128)没有什么不同。

本手册页有更详细的说明。

编辑:关于您更新的问题,答案仍然是相同的。varchar字段将仅使用磁盘上存储的数据所占用的磁盘空间(加上一或两个字节的开销)。因此,无论您使用的是varchar(16)还是varchar(128),如果在其中存储10个字符的字符串,您将只使用10个字节(加上1或2)的磁盘空间。


37
实际上,明智的访问方式会产生巨大的差异,因为当MySql在内存中创建结果集时,它将结果转换为矩阵,因此,如果最大字段为16个字符,但该字段定义为128个字符,则您必须分配额外的112个字符每行。这浪费了很多内存。
克里斯·埃里克森

3
不仅必须为内存中的每一行分配额外的112个字符,而且在每一行进行迭代时,还会有更多的L1高速缓存未命中。将其与VARCHAR(16)列类型进行比较,在该类型中,您可以使用此列将更多的行压缩到后台的高速缓存中。
Aelfinn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.