当我在MySQL中定义列时,通常使用int、varchar(255)、text和偶尔的enum用于布尔值。相比将它们保持最大值,准确指定列类型有什么好处呢?
例如,以MD5编码的密码字段永远不会超过32个字符,因此使用varchar(32)而不是varchar(255)是否会带来明显的性能提升?
当我在MySQL中定义列时,通常使用int、varchar(255)、text和偶尔的enum用于布尔值。相比将它们保持最大值,准确指定列类型有什么好处呢?
例如,以MD5编码的密码字段永远不会超过32个字符,因此使用varchar(32)而不是varchar(255)是否会带来明显的性能提升?
VARCHAR(N)
在N小于等于255时占用相同的空间,因此使用32不会节省空间。但是,使用最能代表实际数据的类型对模式的清晰度和可读性有优势。我同意 Clyde 的观点,但你举的密码例子不是特别好。由于 MD5 哈希值始终为 32 个字符,你可以使用 CHAR(32) 替代 VARCHAR(32),这在许多情况下会更快/更有效。
如果您能固定行大小,则具有极快的索引速度,这是一项巨大的好处。您将需要使用固定列类型,如int和char(某些大小)用于文本。
如果您无论如何都会有可变行大小,并且您的表格将少于100,000条记录,那么您不必太担心优化问题。与varchar相比,文本更加灵活。
关于数据验证,我认为您应该在业务代码/验证中强制执行此操作。
对于整数类型,如果适当时使用一字节/两字节整数而不是四字节或八字节整数,则可以在行中节省空间。这对于具有大量数据的表确实会产生实际影响,因为更多的行将适合于一页。
对于字符类型,如果您控制数据库和代码,则我真的不确定是否会有所区别。但考虑一种分工方式,即数据库设计人员告诉软件开发人员:“嘿,不要让人们在此字段中输入超过100个字符,这将是完全浪费。”通过设置限制来强制执行该限制,如果它是varchar(255),人们可能会浪费空间。
现代关系数据库管理系统在列宽度上不会因为255个字符的列对比50个字符的列而提供更好的性能。
在SQL Server中,我会注意将我的姓名、地址等作为NVarChar
存储,以便在需要时进行国际化。我可以存储超过美国标准10位数字的电话号码。