在 5.0.3 版之后(允许 VARCHAR 为 65,535 字节并停止截断尾随空格),这两种数据类型之间是否有任何重大区别?
我正在阅读差异列表,唯一值得注意的两个是:
对于 BLOB 和 TEXT 列上的索引,您必须指定索引前缀长度。对于 CHAR 和 VARCHAR,前缀长度是可选的。请参阅第 7.5.1 节,“列索引”。
和
BLOB 和 TEXT 列不能有 DEFAULT 值。
那么,由于对 TEXT 数据类型的这两个限制,为什么要在 varchar(65535) 上使用它呢?两者之间是否存在性能影响?
划分链接到一些解释基本问题的信息(存在性能差异),但要说一个总是比另一个更好还不够简单。(否则,没有理由同时拥有两者。)此外,在 MyISM 中,VARCHAR 的 64k 最大大小不是每个字段 - 它是每个记录。
基本上,有 4 种方法可以将字符串存储在数据库记录中:
MyISM 对 VARCHAR 使用类似于 #3 的东西,对 TEXT 使用混合方法,它将字符串的开头存储在记录中,然后将字符串的其余部分存储在其他地方。InnoDB 与 VARCHAR 类似,但将完整的 TEXT 字段存储在记录之外。
使用 1&4 时,记录中的内容总是相同的长度,因此如果您不需要字符串但需要后面的内容,则更容易跳过。#2 和 #3 对于短字符串来说都不算太糟糕...... #2 必须继续寻找标记,而 #3 可以向前跳过......随着字符串变长,#2 对于这种特殊用途会变得更糟案子。
如果您确实需要读取字符串,#4 会更慢,因为您必须读取记录,然后读取可能存储在磁盘上其他位置的字符串,具体取决于该数据库如何处理它。#1 总是很简单,你会再次遇到类似的问题,其中 #2 越长字符串越差,而对于非常小的字符串,#3 比 #2 稍差一些,但随着字符串越长越好。
然后是存储要求......#1始终是固定长度,因此如果大多数字符串不是最大长度,它可能会膨胀。#2 有 1 个额外字节;如果最大长度 = 255,#3 通常有 2 个额外字节,如果最大长度为 64k,则通常有 4 个额外字节。#4 具有指针长度,加上 #3 通常的规则。
对于 MySQL 5.1 中的具体实现,MyISM state的文档:
而对于 InnoDB:
...
与处理数据库时的许多其他事情一样,如果您不确定什么最适合您的需求,请尝试使用类似的数据和用法对其进行基准测试,并查看它们的行为方式。
当一个 SELECT 需要创建一个临时表(例如对结果进行排序)时,它要么创建一个 MEMORY 表,要么创建一个 MyISAM 表。内存更有效。MEMORY 有一些限制——一个是禁止 TEXT 和 BLOB。因此,使用 TEXT 的 SELECT运行速度可能比使用 VARCHAR 慢。