MySQL表中varchar长度的重要性

我有一个dynamic插入行的MySQL表。 因为我不能确定string的长度,也不希望它们被截断,所以我把它们变成了比我需要的大一些的varchar(200)。 给varchar字段的长度比所需要的要长得多吗?

不,从这个意义上说,如果你存储在这个列中的值总是(比方说)less于50个字符,那么声明列为varchar(50)varchar(200)的性能相同。

有一个可能的性能影响:在MySQL中,临时表和MEMORY表将VARCHAR列存储为固定长度的列,填充为最大长度。 如果你devise的VARCHAR列比你所需要的最大的尺寸大得多,你会消耗更多的内存。 这会影响caching效率,sorting速度等

VARCHAR对于描述的情况非常理想,因为它代表“可变字符” – 根据您的示例,限制为200个字符,但接受任何内容都将被接受, 并且不会填充列的分配大小。

VARCHAR也占用较less的空间 – 值存储为单字节或双字节长度前缀加数据。 长度前缀表示该值中的字节数。 如果值不超过255个字节,则列使用一个长度字节,如果值可能需要超过255个字节,则使用两个长度字节。

有关将MySQL CHAR与VARCHAR数据types进行比较的更多信息,请参阅此链接 。

大小是性能! 尺寸越小越好。 不是今天或明天,但有一天,无论您devise了什么样的devise,在严重的瓶颈问题上,桌子的尺寸都会变大。 但是,您可以预见到devise阶段可能会先发生的一些潜在瓶颈,并尝试扩展数据库快速而快乐地执行的时间,直到您需要重新考虑计划或通过添加更多服务器进行水平扩展。

在你的情况下,你可以遇到很多性能泄漏:大的联接几乎不可能与长的varchar列。 索引这些列是一个真正的杀手。 您的磁盘必须存储数据。 一个内存页面可以容纳较less的行,而表扫描将会慢得多。 此外查询caching将不太可能帮助你在这里。

你必须问自己:每年可能会发生多less插页? 平均长度是多less? 我真的需要超过200个字符吗?或者我可以在应用程序前端捕捉到这个字符,甚至可以通知用户最大长度? 我可以将表格拆分成一个窄表,以便进行快速索引和扫描,另一个表格可以容纳额外扩展大小的不太常用的数据? 我可以键入可能的varchar数据到类别,因此提取一些数据到一些较小的,也许int或布尔型列,并缩小varchar列的方式?

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

性能? 号磁盘存储? 是的,但它很便宜,丰富。 除非你的数据库会增长到TB级,否则你可能没关系。

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

可以有性能点击 – 但通常不会在大多数用户会注意到的水平。

当预先知道每个字段的大小时,MySQL知道每个字段/行之间有多less字节,并且可以在不读取所有数据的情况下向前翻页。 使用可变字符减less了优化的能力。

由于数据碎片,varchar会导致性能下降吗?

更好, char vs varchar 。

对于大多数用途,你会没事的 – 但是有一个区别,对于大型数据库,你有select其中一个的原因。

作为varchar,而不仅仅是char,大小是基于一个内部字段来表示它的实际长度和string本身。 所以使用varchar(200)和使用varchar(150)并没有太大的不同,只是你有可能存储更多的东西。

而且你应该考虑更新时发生的情况。 但是,如果这是罕见的,那么你应该没事。

根据数据types名称暗示这是VARCHAR即variables字符数据存储,MySQL引擎本身分配正在使用的内存按照存储的数据,所以根据我的知识没有性能影响。