【发布时间】:2011-12-04 17:27:45
【问题描述】:
我正在为数据库建模,我想询问 Varchar 类型。
Varchar(50) 和 Varchar(100) 之间有性能差异吗?
例如,我有一个 varchar(50) 字段,用户在该字段中保存了 5 个字符数据,另一个用户在该字段中保存了 25 个字符。但是没有人将 50 个字符数据保存到该字段。所以我必须将这个字段设为 varchar(25) 以获得最佳性能?
【问题讨论】:
我正在为数据库建模,我想询问 Varchar 类型。
Varchar(50) 和 Varchar(100) 之间有性能差异吗?
例如,我有一个 varchar(50) 字段,用户在该字段中保存了 5 个字符数据,另一个用户在该字段中保存了 25 个字符。但是没有人将 50 个字符数据保存到该字段。所以我必须将这个字段设为 varchar(25) 以获得最佳性能?
【问题讨论】:
假设SQL Server(因为你也列出了MySQL),没有。
只要字段中的数据相同,开销就相同。
【讨论】:
对于大多数实现,VARCHAR(50) 和VARCHAR(25) 之间可能存在无关紧要的性能差异;可能不值得担心。
根据经验,将字段设置为您认为自己想要使用的大小。
这里有一些相关的讨论:
What are the optimum varchar sizes for MySQL?
从该讨论中,这里是相关的 MySQL 手册页:
http://dev.mysql.com/doc/refman/5.0/en/char.html
【讨论】:
不,如果您定义 varchar(50) 并且最多只存储 10 个字符,则不会降低性能,举个例子。 Varchar 将始终按行存储数据。
【讨论】:
编辑:对于 MySQL:不。至少,除非您有一些介于 50-100 个字符之间的字符串。
通常 varchars 存储为长度 + 数据;仅存储提供的数据。 varchar(100) 的长度需要更多字节(最大 300 字节,假设 utf8 3-bytes-per-character),但这还不够你关心。
索引也是如此。它只是您实际存储的数量。
【讨论】:
列长度应反映用户希望在该列中存储的数据的最大长度。如果您的应用程序是根据经过充分研究的要求设计的,那么该长度应该有一些理由;仅仅因为没有人在该列中存储 > 25 个字符的字符串还 并不意味着他们有一天不会。
要回答您问题的另一方面,减少列的长度不会提高性能。正如文档所言,该列仅占用存储空间以适应分配的数据。因此,只有 25 个字节数据的 VARCHAR(100) 列不会比具有相同数据的 VARCHAR(25) 列占用更多的存储空间。 Find out more.
存储是性能问题吗?可以,因为磁盘上较短的记录等于每次 I/O 操作检索到的记录更多。
【讨论】: