【发布时间】:2010-11-15 06:42:09
【问题描述】:
这个问题基于 performance 和 size
两件事哪种 DATATYPE 更适合使用 TEXT 或 VARCHAR?基于性能哪些会影响哪些会提高?
【问题讨论】:
-
注意:许多答案和评论要么已过时,要么从未完全正确。
标签: mysql
这个问题基于 performance 和 size
两件事哪种 DATATYPE 更适合使用 TEXT 或 VARCHAR?基于性能哪些会影响哪些会提高?
【问题讨论】:
标签: mysql
这取决于您使用它的目的。我不想给出如此笼统的答案,但这是真的。通常,尝试尽可能具体地获取数据类型。如果您的字符串永远不会超过某个字符的上限,那么请使用VARCHAR,因为它会更有效率。如果您需要更多空间,请使用TEXT。如果您不确定您的文本将占用多少空间,您可能应该使用TEXT;性能差异不是很大,最好是面向未来,而不是在您的需求发生变化时冒着改变它的风险。只是我的两分钱。
在 cmets 中,Pitarou 指出,如果 MySQL 为您的查询创建一个临时表(请参阅this),TEXT 列将不会存储在内存中,而必须从磁盘中读取,即慢得多。 (Source,页面底部。)不过,这对于大多数查询来说应该无关紧要。
如果有人想知道 PostgreSQL 的比较,我发现 this benchmark 表明 CHAR、VARCHAR 和 TEXT 的性能都一样好。因此,如果您使用的是 Postgres,那么您使用什么类型并不重要。
【讨论】:
从 V 5.0.3 开始,VARCHAR 的限制从 0-256 增加到 0-65,535(取决于最大行大小(65,535 字节,在所有列之间共享)和使用的字符集。)
如果您使用的是固定长度为 64k 的 TEXT,即使您需要的限制更少
所以最好使用具有更高限制的VARCHAR而不是TEXT。 如果要求超过 64K,请相应地使用 MEDIUMTEXT 或 LONGTEXT。
【讨论】:
针对 TEXT 表的查询总是比针对 VARCHAR 表的查询慢 3 倍(平均值:VARCHAR 表为 0.10 秒,TEXT 表为 0.29 秒)。差异是 100% 可重复的。
【讨论】:
TEXT 版本在PRIMARY KEY 中使用前缀索引。但VARCHAR 版本没有。
VARCHAR 您可以设置每条记录将接受多少个字符的限制,文本(实际上)是无限的......不完全确定性能,但我会假设更具体的数据类型(varchar)会更快。
【讨论】:
VARCHAR 应该具有更好的性能,因为它的大小有限。事实上,在我使用 MySQL 的所有经验中,VARCHAR 的搜索操作总是比 TEXT 快。无论如何,这是基于我的经验。您应该查看文档以了解更多信息。
【讨论】:
这真的取决于你的数据类型。
如果您的字段是固定长度的(例如 32 个字符的哈希值),则使用 CHAR。这具有更好的性能,因为每个条目每行占用相同的空间。
VARCHAR 的标准限制是 255 个字符,但我认为现在已经增加了。 TEXT 非常长,通常只用于大型内容,如整篇博客文章,如果您不想要限制,则使用 cmets。
关于大小,VARCHAR 和 TEXT 之间没有(或很少)差异,因为它们只是存储他们需要的内容。 CHAR 字段将始终占用其分配的长度。
在性能方面,VARCHAR 通常更快。 VARCHAR 也可以被索引,从而加快搜索速度。
【讨论】:
MySQL 在创建临时表时会在内部将 TEXT 转换为 varchar。因此,如果可能,最好使用 VARCHAR。有一些与 TEXT 列相关的小错误,例如...
【讨论】:
根据我的意见,当您知道字符长度时,VARCHAR 是最佳选择。它还将减少垃圾内存分配和空间问题。 TEXT 将消耗 255,而 VARCHAR 将消耗你给它的值。
根据性能,VARCHAR 也比 TEXT 更快。
【讨论】:
text 和 varchar 有细微的差别。我有一张如图所示的表格:
CREATE TABLE `test`.`tbl`(
`kee` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`txt` TEXT(100),
`vrchr` VARCHAR(100),
PRIMARY KEY (`kee`)
);
我插入一行:
INSERT INTO `tbl`
(`txt`,
`vrchr`)
VALUES ('1
2
3',
'1
2
3');
txt 列的值为:
1
2
3
并且列 vrchr 具有值:
1
【讨论】: