2015-04-28 56 views
0

我的数据库的一列存储长文本。大部分文本都小于TEXT(64KB)的限制。然而,其中约0.1%是长文本(> 64KB)。最初我使用TEXT作为列数据类型,并且我必须忽略具有长文本的条目。但是如果我使用LONGTEXT作为数据类型,我发现数据库大小加倍。具有长文本的条目的总大小应该比具有普通文本的条目的总大小小得多。TEXT和LONGTEXT的最小尺寸

TEXT和LONGTEXT是否存在某种“最小大小”,使得每个条目的LONGTEXT数据类型大于条目的TEXT数据类型并导致存储差异?

更具体地说,具有TEXT数据类型的条目大约需要1KB。一个LOnGTEXT条目大约需要2KB。

我使用INNODB,另一列的类型有:

VARCHAR(50) INT(10) VARCHAR(70) VARCHAR(12) VARCHAR(7) VARCHAR(50) varchar(50) datetime

+0

的可能重复[什么是缺点使用的是MySQL LONGTEXT尺寸域时,每个条目会MEDIUMTEXT大小的区域内合适?(http://stackoverflow.com/questions/7314682/what-is-the-disadvantage -to-using-a-mysql-longtext-size-field-when-entry) – Strawberry

回答

0

由于每个LONGTEXT价值存储区都有一个前缀,因此您可能会遇到规模的增长。

reference manual

每个LONGTEXT值使用4个字节的长度前缀 指示的值的字节数被存储。

0

MySQL将内存BLOB数据(包括TEXTLONGTEXT)以字节计数存储并加上前缀。 TEXT存储以双字节前缀计数,因此它可以存储最多2^16 - 2字节的信息。 LONGTEXT将计数存储在一个四字节前缀中,因此它可以存储最多2^32 - 4字节的信息。

将字段存储为LONGTEXT不会自动导致数据库大小加倍,因为唯一是double的就是前缀的大小。然而,改变TEXTLONGTEXT因为MySQL的复制信息时,它改变它,当它这样做并不会自动释放它理论上可以增加一倍的大小。

+0

MySQL可以有更聪明的方式来存储大小,不是吗?像存储两位作为前缀的大小,可以是1-4。只有在大多数记录具有巨大尺寸的情况下才会增加尺寸,这种情况可以忽略不计。 –

+0

@GregoryMagarshak我认为你在这里感到困惑。前缀本身是一个字节数,大小是无关紧要的。问题依然是,MySQL可能会为更多数据分配空间,而当该空间未被占用时,MySQL不会释放它。这比用来存储计数的两个额外字节要重要得多。 –