有任何理由使用 TINYTEXT 吗?

Posted

技术标签:

【中文标题】有任何理由使用 TINYTEXT 吗?【英文标题】:Is there any reason to ever use TINYTEXT? 【发布时间】:2016-06-16 01:40:14 【问题描述】:

据我所知,VARCHAR(255) 做了所有TINYTEXT 可以做的事情。 VARCHAR 具有相同的存储大小,它是 ISO 标准的一部分,它允许使用除 null 之外的默认值。我看不出有任何理由使用TINYTEXT。但它存在,所以也许是有原因的。

在任何情况下,TINYTEXT 将是出于大小、速度或其他考虑的首选数据类型?

【问题讨论】:

重复:***.com/questions/2288628/…? @Varon 我不同意。该问题的答案都没有给出关于是否存在使用 TINYTEXT 的好情况的明确“是”或“否”。 【参考方案1】:

我能想到TINYTEXT 可能有用的唯一情况是,如果您有真的 大行。 VARCHAR 列的内容计入最大行大小 65,535 字节,但 TEXTBLOB 数据不计入; TINYTEXT 列仅将 1 个字节添加到行大小。

实际上,对于 InnoDB 表,事情要复杂一些。 InnoDB 存储在以下页面中进行了描述:

https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html https://dev.mysql.com/doc/refman/5.7/en/innodb-compression-internals.html

总而言之,TINYTEXT 受上述限制的表部分中存储的数据由一个 1 字节长度字段和一个 20 字节指向外部数据的指针组成,因此TINYTEXT 增加了 21字节到行长度。但是,当外部值小于 40 字节时,数据将内联存储在行中。所以对于小于 40 字节的TINYTEXT,存储空间类似于VARCHAR(255),都计入行长限制。

【讨论】:

你有最大行大小的参考吗?它是特定于引擎的吗? dev.mysql.com/doc/refman/5.7/en/column-count-limit.html。任何引擎的最大值为 65,535,但某些引擎的限制可能更小。 在 InnoDB 中,每列需要 20 个字节来指向大 VARCHARsTEXT 的非记录存储。 @RickJames 我想你的意思是BLOBTEXT。你有那个 20 字节的数字的参考吗,我在 MySQL 文档中找不到。 dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html and dev.mysql.com/doc/refman/5.7/en/… "当使用 DYNAMIC 或 COMPRESSED 行格式创建表时,长列值完全离页存储,聚集索引记录仅包含 20 字节指向溢出页的指针。相比之下,COMPACT 行格式在聚集索引记录中最多存储前 768 个字节的可变长度列值以及指向溢出页的 20 字节指针。"【参考方案2】:

TINYTEXT 基本上没用。它的存在可能是为了保持一致性(TEXTBLOB 的 4 种大小)。 TINYTEXT 早在 VARCHAR 可以有超过 255 个字符并且一个字符可以超过一个字节之前就存在于 MySQL 中。

TINYTEXT 实际上比VARCHAR 有缺点。一个复杂的SELECT 可能需要创建一个tmp 表(例如,对于ORDER BY);第一个偏好是使用MEMORY。后备是效率较低的MyISAM。任何大小的TEXTBLOB 都会直接指向MyISAM

不同之处VARCHAR中的数字是字符TEXT 的大小以 字节 为单位。一个utf8 字符最多可以占用3个字节

底线:不要使用TINYTEXT。 (或者TINYBLOB,可以换成VARBINARY(...)。)

【讨论】:

@EvanCarroll - 我说的是 tinyTEXT 而不是 tinyINT。在 Innodb 中,每一列都有相同的开销(1 或 2 字节,取决于表中最宽列的声明大小)。 LONGTEXT(等)有 20(?)字节的开销指向非记录存储(等)。手册中有一些线索讨论“行格式”。 更正:如果行的总大小小于 128 字节,则为 1 字节长度。

以上是关于有任何理由使用 TINYTEXT 吗?的主要内容,如果未能解决你的问题,请参考以下文章

VB - AndAndAlso - 有任何理由使用 And 运算符吗?

是否有任何理由使用 (nr & 1 == 0) 而不是 (nr % 2 == 0) 来检查奇偶校验?

是否有任何理由使用右值引用重载运算符?

有没有理由不使用OrderedDict?

有啥理由不使用“受保护”的属性吗?

有啥理由不使用 Visual Studio 6 for C++? [关闭]