mysql varchar innodb页面大小限制为8100字节

时间:2010-12-29 15:34:09

标签: mysql

关于innodb,有人最近告诉我:

  

“varchar内容超过768字节   存储在补充的16K页“

这非常有趣。如果每个varchar将 latin1 ,我认为每个字母存储为1byte,则单个varchar(500)(<768字节)需要额外的i / o作为varchar(1000)(&gt; ; 768字节)会?? (这个问题是要确定是否所有varchars或只是大的varchars被拆分成一个单独的页面)

每个varchar的768限制或行中的所有varchars是否加在一起? (例如,这是否得到优化 - varchar(300),varchar(300),varchar(300):[其中每个单独的varchar列低于768但是它们一起高于768个字符]?

我很困惑768限制是否与每个单独的varchar或行中的所有varchars相关(如问题所示)。有任何澄清吗?

编辑:删除了有关CHARS的部分,因为他们发现了最多255个限制

1 个答案:

答案 0 :(得分:0)

当前MySQL的documentation没有提到这个约束。它实际上给人的印象是VARCHAR存储在行本身中,因为一行中所有VARCHAR的长度总和不能超过65k字节。

它还提到存储是长度+数据,这与您描述的不同。

我确实在MySQL compression internals中找到了分割存储:

  

在先前版本中创建的表   InnoDB使用“Antelope”文件格式,   仅支持   ROW_FORMAT =冗余和   ROW_FORMAT = COMPACT。在这些格式中,   InnoDB存储了前768个字节   BLOB,VARCHAR和TEXT列中的   聚集索引记录与   首要的关键。 768字节的前缀是   接着是一个20字节的指针   包含其余内容的溢出页面   列值。

对我而言,这表明在确定该列是否需要溢出时,每个列都会被单独考虑。

这似乎与MySQL的较新的版本形成鲜明对比,它们似乎存储VARCHAR的方式完全不同。新版本中的VARCHAR最大长度为65k字节,似乎存储在记录中(无溢出),这导致约束所有列一起不超过65k字节。

CHAR非常不同。它的最大长度为255,并存储在行本身中。所以没有CHAR(500):)

  

CHAR列的长度是固定的   到你宣布的时间长度   你创建表。长度可以   是0到255之间的任何值。当CHAR   值存储,它们是   右边有空格的   指定长度。当CHAR值是   检索到的尾随空格被删除   除非PAD_CHAR_TO_FULL_LENGTH SQL   模式已启用。