2015-04-28 264 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不會釋放它。這比用來存儲計數的兩個額外字節要重要得多。 –