MySQL的最佳varchar大小是多少?

ae.*_*ae. 66 mysql varchar

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

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

通过示例澄清.假设我有一个20个字符的varchar字段.MySQL在创建这个字段时,基本上保留了32个字节的空间(不确定它们是否为字节)但只允许输入20个字节?

我想我担心为大型表优化磁盘空间.

Kri*_*son 56

要回答这个问题,在磁盘上MySql使用1 +字段中用于存储数据的大小(因此,如果列声明为varchar(45),并且字段为"FooBar",则它将在磁盘上使用7个字节,当然,除非您使用多字节字符集,否则它将使用14个字节).因此,无论您声明列,它都不会对存储端产生影响(您表示您担心大型表的磁盘优化).但是,它确实会对查询产生影响,因为当MySql创建临时表(SORT,ORDER等)时,VARCHAR会转换为CHAR,并且您可以将更多记录放入单个页面中,内存越少,表扫描速度越快是.

  • 不,在多字节上它是(大小*2)+ 1. (4认同)
  • @Kris:我相信它也可以是(尺寸*3)+ 1甚至(尺寸*4)+ 1,不是吗? (3认同)
  • 关于多字节的声明是非常误导的.UTF-8是一种多字节字符编码,但对于ASCII和Latin1字符(UTF8的前256个字符),您将拥有一个字节一个字符的对应关系.UTF-16仅对基本多语言平面中的代码点使用每个代码点2个字节. (2认同)

zom*_*bat 24

MySQL将varchar字段存储为可变长度记录,使用一个字节或两个字节的前缀来指示记录大小.

拥有存储大小模式对于MySQL在处理可变长度记录存储时的运行方式并没有任何影响.varchar(x)声明中指定的长度将简单地确定可以存储的数据的最大长度.基本上,varchar(16)与varchar(128)的磁盘方式没有区别.

本手册页有更详细的解释.

编辑:关于您更新的问题,答案仍然是相同的.varchar字段只会占用磁盘上与存储在其中的数据一样多的空间(加上一个或两个字节的开销).因此,如果你有一个varchar(16)或一个varchar(128)并不重要,如果你在其中存储一个10个字符的字符串,你将只使用10个字节(加上1或2个)的磁盘空间.

  • 实际上访问方式它有很大的不同,因为当MySql在内存中创建结果集时,它会将其转换为矩阵,因此如果您的最大字段是16个字符,但该字段定义为128个字符,则必须分配额外的112个字符对于每一行.这浪费了很多记忆. (35认同)
  • 您不仅需要为内存中的每一行分配额外的112个字符,而且每行迭代时您将有更多的L1缓存未命中.这与VARCHAR(16)列类型进行比较,您可以使用此列将更多行压缩到引擎盖下的高速缓存中. (3认同)