Closed. This question needs to be more
focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过
editing this post专注于一个问题。
9个月前关闭。
背景:
很长时间以来,我几乎将varchar(255)用于任何我知道会小于255 char的字符串。后来,我了解了使用varchar(20)或类似内容更好地定义字段的好处,并且从某种意义上说,甚至可以帮助清理输入。
即我知道在存储数据时说字符串“ Hello World!”。例如,varchar(20)和varchar(255)使用相同的存储空间,但是如果我要在创建用于比较/计算的临时表的任何查询中引用该列,则MySQL将对该表使用更多的RAM(每个表值将被填充为255个字符),但是即使在varchar(20)和带有“ Hello World!”(12个字符)以及所有其他10个字符或更少字符的字符串的情况下,MySQL也会使用比严格必要更多的RAM将表保留在工作内存中。
它会使用较少的内存来首先计算该列中任何值的最大长度吗?
伪码
var max = value1.length;
foreach(value){
if(value.length > max)
{max=value.length}
}
然后使用最大作为临时表的列的长度?
我不知道为什么这至少在并发时不会使用更少的内存。因此,也许更好的问题是,为什么不这样做呢?在计算的时间/处理器使用方面,是否有过多的性能折衷?在为临时表分配内存之前是否有可能执行此计算?
严格的问题:
为什么在创建包含该列值的临时表之前,MySQL不计算列中的最大varchar长度?
编辑:
回应一些好的评论问题/观点:
回复:Larnu 7B值示例-
检查7b值肯定会很昂贵,但是如果它是varchar(255)并且最长的值实际上只有190个字符,那么您将防止引擎在存储中创建455b额外的空白...所以我想我我想知道为什么以前的检查肯定会在两种情况下恶化。
回复:雷蒙德·尼兰(Raymond Nijland)。您没有针对该概念提出任何具体观点。您承认它使用了更多的RAM,但没有合理的理由来权衡这种方法会更好或更有效。简单地说,将varchar转换为char就像是说用斧头砍柴要比用液压机砍柴要好,因为它更简单,就像用斧头砍柴一样。我知道极端类比,但是逻辑是一样的。因此,除了很难有效地进行有效编码外,我试图弄清楚为什么效率会降低。还是更有效
回复:里克·詹姆斯(Rick James)表示已实施-
带我进行更具体的搜索,我现在认为我的问题是多余的,因为MySQL似乎已在8.0及更高版本中实现了此功能。我希望对情况更熟悉的人可以为我确认一下。或提供开发人员可以更好地理解的术语的详细信息>数据库管理员(提示我不是数据库管理员)