MySQL 的最佳 varchar 大小是多少?

Posted

技术标签:

【中文标题】MySQL 的最佳 varchar 大小是多少?【英文标题】:What are the optimum varchar sizes for MySQL? 【发布时间】:2010-11-12 04:58:30 【问题描述】:

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

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

通过示例进行说明。假设我有一个 20 个字符的 varchar 字段。 MySQL在创建这个字段的时候,基本上是预留32个字节的空间(不知道是不是字节)但只允许输入20个?

我想我担心如何为一张大表优化磁盘空间。

【问题讨论】:

我想指出,从 MySQL 5.0.3 开始,varchar 可以超过 65,535 【参考方案1】:

MySQL 将 varchar 字段存储为可变长度记录,使用一字节或二字节前缀表示记录大小。

存储大小的模式对于 MySQL 在处理可变长度记录存储时的运行方式并没有真正的影响。 varchar(x) 声明中指定的长度将简单地确定可以存储的数据的最大长度。基本上,varchar(16) 在磁盘方面与 varchar(128) 没有什么不同。

This manual page有更详细的解释。

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

【讨论】:

实际上明智地访问它会产生巨大的差异,因为当 MySql 在内存中创建结果集时,它会将其转换为矩阵,因此如果您的最大字段是 16 个字符,但该字段被定义为 128 个字符您必须为每一行分配额外的 112 个字符。这会浪费很多内存。 您不仅需要为内存中的每一行分配额外的 112 个字符,而且当每一行被迭代时,您将有更多的 L1 缓存未命中。这与 VARCHAR(16) 列类型相比,在这种列类型中,您可以使用该列将更多行压缩到引擎盖下的高速缓存中。【参考方案2】:

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

【讨论】:

嗯?所以,在多字节字符集上它是 ((size) + 2) ? 不,在多字节上是 (size * 2) + 1。 @Kris:我相信也可以是(size * 3) + 1 甚至是(size * 4) + 1,不是吗? 关于多字节的说法非常具有误导性。 UTF-8 是一种多字节字符编码,但对于 ASCII 和 Latin1 字符(UTF8 的前 256 个字符),您将有一个字节与一个字符的对应关系。 UTF-16 将仅用于基本多语言平面中的代码点,每个代码点 2 个字节。 如果大小超过255,需要的总空间应该是size * N + 2。

以上是关于MySQL 的最佳 varchar 大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

mysql varchar定义长度多少为好

mysql varchar最大是多少?

《MySQL系列-开发相关》MySQL的varchar(n)能存储几个字符?占多少字节?

垂直分区 MySQL 表

MySQL char & varchar 字符集 & 存储大小

MySQL中varchar与char区别