有任何理由使用 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 字节,但 TEXT
和 BLOB
数据不计入; 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 个字节来指向大VARCHARs
和 TEXT
的非记录存储。
@RickJames 我想你的意思是BLOB
和TEXT
。你有那个 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
基本上没用。它的存在可能是为了保持一致性(TEXT
和 BLOB
的 4 种大小)。 TINYTEXT
早在 VARCHAR
可以有超过 255 个字符并且一个字符可以超过一个字节之前就存在于 MySQL 中。
TINYTEXT
实际上比VARCHAR
有缺点。一个复杂的SELECT
可能需要创建一个tmp 表(例如,对于ORDER BY
);第一个偏好是使用MEMORY
。后备是效率较低的MyISAM
。任何大小的TEXT
和BLOB
都会直接指向MyISAM
。
不同之处是VARCHAR
中的数字是字符; TEXT
的大小以 字节 为单位。一个utf8 字符最多可以占用3个字节。
底线:不要使用TINYTEXT
。 (或者TINYBLOB
,可以换成VARBINARY(...)
。)
【讨论】:
@EvanCarroll - 我说的是 tinyTEXT 而不是 tinyINT。在 Innodb 中,每一列都有相同的开销(1 或 2 字节,取决于表中最宽列的声明大小)。LONGTEXT
(等)有 20(?)字节的开销指向非记录存储(等)。手册中有一些线索讨论“行格式”。
更正:如果行的总大小小于 128 字节,则为 1 字节长度。以上是关于有任何理由使用 TINYTEXT 吗?的主要内容,如果未能解决你的问题,请参考以下文章
VB - AndAndAlso - 有任何理由使用 And 运算符吗?