每次建立一个新的SQL表或向现有表添加一个新的varchar列时,我都想知道一件事:长度的最佳值是多少。
假设,你有一个列名为name类型为varchar。所以,你必须选择长度。我想不出一个20个字符的名字,但你永远不会知道。但不是用20,我总是四舍五入到下一个2^n。在这种情况下,我将选择32作为长度。我这样做,是因为从计算机科学家的角度来看,2^n这个数字在我看来比其他数字更均匀,我只是假设下面的架构可以比其他数字更好地处理这些数字。
另一方面,以MSSQL服务器为例,当您选择创建varchar列时,将默认长度值设置为50。这让我开始思考。为什么50 ?它只是一个随机数,还是基于平均列长,还是什么?
也可能是——或者可能是——不同的SQL服务器实现(如MySQL, MSSQL, Postgres,…)有不同的最佳列长度值。
每当我建立一个新的SQL表时,我都觉得2^n更“均匀”……但总结一下这里的答案,简单地定义varchar(2^n)甚至varchar(MAX)对存储空间没有显著影响。
也就是说,在设置较高的varchar()限制时,您仍然应该预料到对存储和性能的潜在影响。例如,假设您创建了一个varchar(MAX)列来保存具有全文索引的产品描述。如果99%的描述只有500个字符长,然后突然有人用维基百科文章替换了这些描述,您可能会注意到意想不到的存储和性能显著下降。
Bill Karwin说的另一件事
有一个可能的性能影响:在MySQL中,临时表
和MEMORY表将VARCHAR列存储为固定长度的列,
填充到最大长度。如果你经常设计VARCHAR列
大于您所需要的最大大小,您将消耗更多的内存
那你就必须这么做。这会影响缓存效率、排序速度等。
基本上,只是在稍微大一点的规模上提出合理的业务限制和错误。正如@onedaywhen指出的那样,英国的姓通常在1-35个字符之间。如果你决定将它设为varchar(64),你不会真的伤害到任何东西……除非你存储的是这个人的姓据说有666个字符长。在这种情况下,也许varchar(1028)更有意义。
如果有用的话,下面是varchar 2^5到2^10如果填满的样子:
varchar(32) Lorem ipsum dolor sit amet amet.
varchar(64) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
varchar(128) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
varchar(256) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
velit metus, sit amet tristique purus condimentum eleifend. Quis
que mollis magna vel massa malesuada bibendum. Proinde tincidunt
varchar(512) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
velit metus, sit amet tristique purus condimentum eleifend. Quis
que mollis magna vel massa malesuada bibendum. Proinde tincidunt
dolor tellus, sit amet porta neque varius vitae. Seduse molestie
lacus id lacinia tempus. Vestibulum accumsan facilisis lorem, et
mollis diam pretium gravida. In facilisis vitae tortor id vulput
ate. Proin ornare arcu in sollicitudin pharetra. Crasti molestie
varchar(1024) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
velit metus, sit amet tristique purus condimentum eleifend. Quis
que mollis magna vel massa malesuada bibendum. Proinde tincidunt
dolor tellus, sit amet porta neque varius vitae. Seduse molestie
lacus id lacinia tempus. Vestibulum accumsan facilisis lorem, et
mollis diam pretium gravida. In facilisis vitae tortor id vulput
ate. Proin ornare arcu in sollicitudin pharetra. Crasti molestie
dapibus leo lobortis eleifend. Vivamus vitae diam turpis. Vivamu
nec tristique magna, vel tincidunt diam. Maecenas elementum semi
quam. In ut est porttitor, sagittis nulla id, fermentum turpist.
Curabitur pretium nibh a imperdiet cursus. Sed at vulputate este
proin fermentum pretium justo, ac malesuada eros et Pellentesque
vulputate hendrerit molestie. Aenean imperdiet a enim at finibus
fusce ut ullamcorper risus, a cursus massa. Nunc non dapibus vel
Lorem ipsum dolor sit amet, consectetur Praesent ut ultrices sit
每当我建立一个新的SQL表时,我都觉得2^n更“均匀”……但总结一下这里的答案,简单地定义varchar(2^n)甚至varchar(MAX)对存储空间没有显著影响。
也就是说,在设置较高的varchar()限制时,您仍然应该预料到对存储和性能的潜在影响。例如,假设您创建了一个varchar(MAX)列来保存具有全文索引的产品描述。如果99%的描述只有500个字符长,然后突然有人用维基百科文章替换了这些描述,您可能会注意到意想不到的存储和性能显著下降。
Bill Karwin说的另一件事
有一个可能的性能影响:在MySQL中,临时表
和MEMORY表将VARCHAR列存储为固定长度的列,
填充到最大长度。如果你经常设计VARCHAR列
大于您所需要的最大大小,您将消耗更多的内存
那你就必须这么做。这会影响缓存效率、排序速度等。
基本上,只是在稍微大一点的规模上提出合理的业务限制和错误。正如@onedaywhen指出的那样,英国的姓通常在1-35个字符之间。如果你决定将它设为varchar(64),你不会真的伤害到任何东西……除非你存储的是这个人的姓据说有666个字符长。在这种情况下,也许varchar(1028)更有意义。
如果有用的话,下面是varchar 2^5到2^10如果填满的样子:
varchar(32) Lorem ipsum dolor sit amet amet.
varchar(64) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
varchar(128) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
varchar(256) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
velit metus, sit amet tristique purus condimentum eleifend. Quis
que mollis magna vel massa malesuada bibendum. Proinde tincidunt
varchar(512) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
velit metus, sit amet tristique purus condimentum eleifend. Quis
que mollis magna vel massa malesuada bibendum. Proinde tincidunt
dolor tellus, sit amet porta neque varius vitae. Seduse molestie
lacus id lacinia tempus. Vestibulum accumsan facilisis lorem, et
mollis diam pretium gravida. In facilisis vitae tortor id vulput
ate. Proin ornare arcu in sollicitudin pharetra. Crasti molestie
varchar(1024) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donecie
vestibulum massa. Nullam dignissim elementum molestie. Vehiculas
velit metus, sit amet tristique purus condimentum eleifend. Quis
que mollis magna vel massa malesuada bibendum. Proinde tincidunt
dolor tellus, sit amet porta neque varius vitae. Seduse molestie
lacus id lacinia tempus. Vestibulum accumsan facilisis lorem, et
mollis diam pretium gravida. In facilisis vitae tortor id vulput
ate. Proin ornare arcu in sollicitudin pharetra. Crasti molestie
dapibus leo lobortis eleifend. Vivamus vitae diam turpis. Vivamu
nec tristique magna, vel tincidunt diam. Maecenas elementum semi
quam. In ut est porttitor, sagittis nulla id, fermentum turpist.
Curabitur pretium nibh a imperdiet cursus. Sed at vulputate este
proin fermentum pretium justo, ac malesuada eros et Pellentesque
vulputate hendrerit molestie. Aenean imperdiet a enim at finibus
fusce ut ullamcorper risus, a cursus massa. Nunc non dapibus vel
Lorem ipsum dolor sit amet, consectetur Praesent ut ultrices sit