MySQL表中varchar长度的重要性

Bri*_*ian 104 mysql sql performance types

我有一个MySQL表,动态插入行.因为我不能确定字符串的长度并且不希望它们被切断,所以我将它们变成varchar(200),这通常比我需要的大得多.给varchar字段的长度是否超过必要的长度?

Bil*_*win 286

有一个可能的性能影响:在MySQL中,临时表和MEMORY表将VARCHAR列存储为固定长度的列,填充到其最大长度.如果你设计的VARCHAR列比你需要的最大尺寸大,那么你将消耗更多的内存.这会影响缓存效率,排序速度等.

  • +1.我也似乎有些JDBC驱动程序在设置缓冲区来检索行时为最大大小分配了足够的空间.毋庸置疑,当一些小丑刚刚完成varchar(50000)以防万一有一个非常大的姓氏时,这会引起很多焦虑和咬牙切齿:-) (32认同)
  • +1.这是一个重要的影响,我相信这是这个问题的真正答案. (21认同)
  • 这个答案和接受的答案都是理解OP正确答案所必需的. (6认同)
  • 事实上,当这样一个`MEMORY`表被认为太大时,它会写入磁盘,导致性能显着下降。 (2认同)

Ale*_*lli 58

不,在这个意义上,如果你在该列中存储的值总是(说)少于50个字符,宣告列varchar(50)varchar(200)具有相同的性能.

  • 不完全是真的.请参阅[Bill Karwin]的答案(http://stackoverflow.com/questions/1962310/importance-of-varchar-length-in-mysql-table#answer-1962329) (9认同)
  • 我认为类似的答案应得到文档,基准测试或类似工具的支持。 (2认同)

OMG*_*ies 14

VARCHAR非常适合您描述的情况,因为它代表"可变字符" - 根据您的示例,限制将是200个字符,但接受的任何内容都不会被填充,并且不会填充列的分配大小.

VARCHAR也占用更少的空间 - 值存储为一个字节或两个字节长度的前缀加数据.长度前缀表示值中的字节数.如果值不超过255个字节,则列使用一个长度字节;如果值可能需要超过255个字节,则列使用两个长度字节.

有关比较MySQL CHAR与VARCHAR数据类型的更多信息,请参阅此链接.


小智 13

尺寸是性能!尺寸越小越好.不是今天或明天,但有一天,无论你设计什么样的设计,当你遇到严重的瓶颈时,你的桌子都会变得很大.但是,您可以预见设计阶段可能首先出现的一些潜在瓶颈,并尝试扩展数据库快速,愉快地执行的时间,直到您需要重新考虑您的方案或通过添加更多服务器来横向扩展.

在您的情况下,您可能遇到许多性能泄漏:使用长varchar列几乎不可能进行大型连接.对这些列进行索引是一个真正的杀手.您的磁盘必须存储数据.一个内存页面可以容纳更少的行,而表扫描会慢得多.查询缓存也不太可能在这里帮助你.

你必须问自己:每年可能发生多少次插入?平均长度是多少?我是否真的需要超过200个字符,或者我可以在我的应用程序前端捕获它,即使通知用户最大长度?我可以将表格分成一个较窄的表格以进行快速索引和扫描,另一个表格可以保存额外的,不太常用的扩展大小数据吗?我可以将可能的varchar数据类型分类,然后将一些数据提取到一些较小的,可能是int或bool类型的列中,并以这种方式缩小varchar列吗?

你可以在这里做很多事情.最好先进行第一次假设,然后使用实际测量的性能数据逐步重新设计.祝好运.

  • 设置较高的最大长度是否会对实际性能产生影响,还是性能仅取决于实际尺寸? (4认同)

duf*_*ymo 5

性能?否。磁盘存储?是的,但价格便宜又很多。除非您的数据库将增长到TB级,否则您可能还可以。


小智 5

你们中的一些人错误地认为 avarchar(200)在磁盘上占用的表大小比 a 多varchar(20)。不是这种情况。只有当您超过 255 个字符时,mysql 才会使用额外的字节来确定varchar字段数据的长度。

  • 临时表和`MEMORY` 表不是这样。 (9认同)
  • 每当您的选择查询使用临时表(按操作进行分组和排序等)时,它都会将 varchar(200) 转换为 char(200) 并且性能会受到影响。 (5认同)