mysql varchar 缺点_关于mysql:对所有基于文本的字段使用泛型varchar(255)是否有缺点?...

我有一个contacts表,其中包含postcode,first name,last name,town,country,phone number等字段,所有字段都定义为VARCHAR(255),即使没有 这些字段将几乎接近255个字符。 (如果您想知道,是因为Ruby on Rails迁移默认情况下将String字段映射到VARCHAR(255),而我从不费心重写它)。

由于VARCHAR仅存储字段的实际字符数(以及字段长度),因此使用VARCHAR(16)而不是VARCHAR(255)有什么明显的优势(性能还是其他方面)?

此外,这些字段中的大多数都有索引。 字段上的较大VARCHAR大小是否会影响索引的大小或性能?

仅供参考,我正在使用MySQL 5。

@ceejayoz,声明接受的答案是不正确的,但没有解释为什么没有真正帮助。 更糟糕的是,接受的答案会随着时间而变化,您的评论会使人们误以为新的接受的答案是不正确的。

@Gili删除了我的评论,因为OP显然改变了他们的接受度。 好的观点,在将来的病态中会指出我在说什么答案以及原因。

这个重复的问题的其他一些答案stackoverflow.com/questions/1262174/

在存储中,VARCHAR(255)足够聪明,可以仅存储给定行上所需的长度,而CHAR(255)总是会存储255个字符。

但是既然你用MySQL标记了这个问题,我会提到一个特定于MySQL的提示:当行从存储引擎层复制到SQL层时,VARCHAR字段被转换为CHAR以获得使用的优势固定宽度的行。因此,内存中的字符串将填充为声明的VARCHAR列的最大长度。

当查询隐式生成临时表时(例如在排序或GROUP BY时),这会占用大量内存。如果您对不需要太长的数据使用大量的VARCHAR(255)字段,这会使临时表变得非常大。

您可能还想知道这种"填充"行为意味着使用utf8字符集声明的字符串会填充每个字符三个字节,即使对于存储单字节内容的字符串(例如ascii或latin1字符)也是如此。同样,utf8mb4字符集会使字符串在内存中每个字符填充到四个字节。

因此,存储短字符串(如"无意见")的utf8中的VARCHAR(255)在磁盘上占用11个字节(10个低字符集字符,加上一个字节用于长度),但在内存中需要765个字节,因此在临时表或排

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值