【问题标题】:Minimum Size of TEXT and LONGTEXTTEXT 和 LONGTEXT 的最小尺寸
【发布时间】:2015-04-28 13:47:23
【问题描述】:

我的数据库的一列存储了一个长文本。大多数文本小于 TEXT 的限制(64KB)。然而,其中大约 0.1% 是长文本(> 64KB)。最初我使用 TEXT 作为列数据类型,我不得不忽略长文本的条目。但是如果我使用 LONGTEXT 作为数据类型,我发现数据库大小翻了一番。长文本条目的总大小应远小于普通文本条目的总大小。

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

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

我用的是innoDB,其他列的类型是:

varchar(50) 整数(10) varchar(70) varchar(12) varchar(7) varchar(50) varchar(50) 日期时间

【问题讨论】:

标签: mysql sql sqldatatypes


【解决方案1】:

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

将字段存储为LONGTEXT 不会自动导致数据库大小加倍,因为唯一加倍的是前缀的大小。但是,将其从 TEXT 更改LONGTEXT 理论上可以使大小翻倍,因为 MySQL 在更改信息时会复制信息,并且在完成后不会自动释放信息。

【讨论】:

  • MySQL 可以有一种更智能的方式来存储大小,不是吗?就像存储两个位作为前缀的大小,可以是 1-4。它只会在大多数记录的大小很大的情况下增加大小,这种情况可以忽略不计。
  • @GregoryMagarshak 我认为你在这里混淆了一些东西。前缀本身就是一个字节数,大小无关紧要。问题仍然存在,MySQL 可能会为更多数据分配空间,并且在该空间未使用时不释放它。这比用于存储计数的两个额外字节重要得多。
【解决方案2】:

由于每个 LONGTEXT 值存储的前缀,您可能会遇到规模增长。

来自reference manual

每个 LONGTEXT 值都使用 4 字节长度前缀存储 表示值中的字节数。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多