MySQL的最佳varchar大小是多少?

16 浏览
0 Comments

MySQL的最佳varchar大小是多少?

MySQL如何存储varchar字段?我能否假定以下模式代表合理的存储大小:1、2、4、8、16、32、64、128、255(最大)?通过示例进行澄清。假设我有一个20个字符的varchar字段。在创建此字段时,MySQL是否基本上保留32个字节(不确定是否为字节)的空间,但只允许输入20个字节?我担心为一个大表优化磁盘空间。

0
0 Comments

MySQL将varchar字段存储为可变长度记录,并使用一字节或两字节的前缀表示记录大小。在处理可变长度记录存储时,存储大小的模式对MySQL的功能没有任何影响。在varchar(x)声明中指定的长度只是确定可以存储的数据的最大长度。基本上,varchar(16)在磁盘上与varchar(128)没有任何区别。

这个问题的出现是因为,无论字段的实际数据长度是多少,varchar字段都会占用与字段声明的最大长度相同的存储空间。这导致在内存中创建结果集时,如果字段的声明长度比实际数据长度长很多,会浪费大量的内存空间。此外,对于声明长度较长的varchar字段,在迭代每一行时,会有更多的L1缓存未命中,相比于声明长度较短的varchar字段,这会导致性能下降。

解决这个问题的方法是根据实际数据的长度来选择合适的varchar字段长度。如果数据的最大长度是16个字符,那么选择varchar(16)字段可以节省内存空间,并且在迭代每一行时可以减少L1缓存未命中。

总结起来,为了优化MySQL的性能和内存占用,应根据实际数据的长度选择合适的varchar字段长度。

0
0 Comments

为了回答这个问题,在磁盘上,MySQL使用字段中使用的大小加1来存储数据(所以如果列声明为varchar(45),并且字段为"FooBar",它将在磁盘上使用7个字节,除非当然你使用的是多字节字符集,这样它将使用14个字节)。所以,无论如何声明你的列,在存储端不会有任何区别(你提到你担心对于一个大型表的磁盘优化)。然而,在查询中是有区别的,因为当MySQL创建临时表(排序、排序等)时,VARCHAR会被转换为CHAR,而你可以将更多的记录放入一个单独的页面中,表扫描所需的内存就越少,速度就越快。

那么,在多字节字符集上是((size) + 2)吗?

不,对于多字节字符集是(size * 2) + 1。

我相信它也可以是(size * 3) + 1甚至是(size * 4) + 1,对吗?

关于多字节的说法非常误导。UTF-8是一种多字节字符编码,但对于ASCII和Latin1字符(UTF8的前256个字符),你将拥有一个字节对应一个字符的对应关系。UTF-16只会在基本多语言平面的代码点上使用2个字节的代码点。

如果大小超过255,则所需的总空间应为size * N + 2。

wizist是正确的,从MySQL 5.0.3开始,您可以声明大于255个字符的VARCHAR字段,在这种情况下,大小将为((size * 2) + 2)字节。来源:dev.mysql.com/doc/refman/5.0/en/char.html

ASCII只是UTF8的前128个字符。它需要至少一个额外的位来表示你正在开始一个多字节字符。

这是否意味着VARCHAR(45)与VARCHAR(200)在像排序、排序这样的查询性能上有所不同?无论实际存储数据的长度如何?

0