你应该在MySQL中准确指定列类型吗?

时间:2009-07-09 15:15:44

标签: php mysql performance optimization

当我在MySQL中定义列时,我通常使用int,varchar(255),text和偶尔使用boum的枚举。准确指定列类型而不是仅仅保留它们的好处是什么?

例如,编码为MD5的密码字段永远不会超过32个字符,因此使用varchar(32)而不是varchar(255)会有明显的性能提升吗?

5 个答案:

答案 0 :(得分:4)

the manual,给定实际长度的VARCHAR(N)对于任何N最多255的空间占用相同的空间,因此使用32不会节省空间。但是,在使用最能代表实际数据必须类似的类型时,模式的清晰度和可读性具有优势。

答案 1 :(得分:2)

我同意克莱德所说的,但你的密码示例并不是特别好。由于MD5总和将始终为32个字符,因此您可以使用CHAR(32)而不是VARCHAR(32),这在许多情况下会更快/更有效。

答案 2 :(得分:2)

如果您可以修改行大小,那将会有很大的好处。然后索引是超快的。您必须使用固定列类型(如int)和char(某些大小)作为文本。

如果您仍然会有可变的行大小,并且您的表的记录少于100k,那么您不必担心优化问题。文本而不是varchar更灵活。

关于数据验证,我认为您应该在业务代码/验证中强制执行此操作。

答案 3 :(得分:1)

对于整数类型,如果在适当时使用一个字节/两个字节的整数而不是四个或八个字节的整数,则可以节省行中的空间。这确实会对包含大量数据的表产生实际影响,因为页面上会有更多行。

对于字符类型,如果您控制db和代码,我真的不确定它是否会有所作为。但是考虑一下数据库设计师告诉软件开发人员的分工,“嘿,不要让人们在这个领域放置超过100个字符,这将是一个完全浪费”。你通过设置限制来强制执行,如果它是varchar(255),人们可能会浪费空间。

答案 4 :(得分:1)

由于列宽,现代RDBMS并没有真正为50个字符的列上的255个字符列提供更好的性能。

在SQL Server上,我注意将我的姓名,地址等设为NVarChar,以便我可以在需要时进行国际化。我有一个电话号码存储,能够在美国存储超过10位数字。