【问题标题】:Should you accurately specify column types in MySQL?您是否应该在 MySQL 中准确指定列类型?
【发布时间】:2009-07-09 15:15:44
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql performance optimization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果您可以固定行大小,那么会有很大的好处。然后索引是超快的。对于文本,您必须使用固定的列类型,例如 int 和 char(some size)。

        如果您的行大小是可变的,并且您的表中的记录少于 10 万条,那么您不必太担心优化问题。 text 代替 varchar 更灵活。

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

        【讨论】:

          【解决方案4】:

          对于整数类型,如果在适当的时候使用 1 字节/2 字节整数而不是 4 或 8 字节整数,则可以节省行中的空间。这确实对包含大量数据的表产生了切实的影响,因为页面上可以容纳更多的行。

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2014-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-15
              • 2011-06-08
              相关资源
              最近更新 更多