【发布时间】:2009-07-09 15:15:44
【问题描述】:
当我在 MySQL 中定义列时,我通常使用 int、varchar(255)、text 和偶尔的枚举作为布尔值。准确指定列类型而不是只保留它们的最大值有什么好处?
例如,编码为 MD5 的密码字段永远不会超过 32 个字符,那么使用 varchar(32) 是否比 varchar(255) 有明显的性能提升?
【问题讨论】:
标签: php mysql performance optimization
当我在 MySQL 中定义列时,我通常使用 int、varchar(255)、text 和偶尔的枚举作为布尔值。准确指定列类型而不是只保留它们的最大值有什么好处?
例如,编码为 MD5 的密码字段永远不会超过 32 个字符,那么使用 varchar(32) 是否比 varchar(255) 有明显的性能提升?
【问题讨论】:
标签: php mysql performance optimization
根据the manual,给定实际长度的VARCHAR(N) 对任何 N 最多为 255 占用相同数量的空间,因此使用 32 不会节省空间。但是,使用最能代表实际数据必须是什么样的类型时,您的架构具有清晰性和可读性的优势。
【讨论】:
我同意 Clyde 的说法,但您的密码示例并不是一个特别好的示例。由于 MD5 总和始终为 32 个字符,因此您可以使用 CHAR(32) 而不是 VARCHAR(32),这在许多情况下会更快/更有效。
【讨论】:
如果您可以固定行大小,那么会有很大的好处。然后索引是超快的。对于文本,您必须使用固定的列类型,例如 int 和 char(some size)。
如果您的行大小是可变的,并且您的表中的记录少于 10 万条,那么您不必太担心优化问题。 text 代替 varchar 更灵活。
关于数据验证,我认为您应该在业务代码/验证中强制执行此操作。
【讨论】:
对于整数类型,如果在适当的时候使用 1 字节/2 字节整数而不是 4 或 8 字节整数,则可以节省行中的空间。这确实对包含大量数据的表产生了切实的影响,因为页面上可以容纳更多的行。
对于字符类型,如果您同时控制数据库和代码,我真的不确定它是否会有所作为。但是考虑一下数据库设计人员告诉软件开发人员的分工,“嘿,不要让人们在这个字段中输入超过 100 个字符,这将完全是浪费”。您通过设置限制来强制执行,如果是 varchar(255),人们很可能会浪费空间。
【讨论】:
由于列宽,现代 RDBMS 在 255 个字符的列上并没有真正为您提供比 50 个字符的列更好的性能。
在 SQL Server 上,我注意将我的姓名、地址等设置为 NVarChar,以便在需要时进行国际化。在美国,我的电话号码存储设备可以存储超过 10 位数字。
【讨论】: