【问题标题】:Database MySql design - varchar length for utf8 fields :: 1. password 2. username 3.email数据库 MySql 设计 - utf8 字段的 varchar 长度 :: 1. 密码 2. 用户名 3.email
【发布时间】:2011-03-02 15:02:43
【问题描述】:

大多数时候我定义 varchar(255) 长度自动。

但现在我在想应该为 utf8 字段定义多少 varchar 长度:

  1. 密码

  2. 用户名

  3. 电子邮件

如果这个字段应该定义小于 varchar 255,它会提高多少性能?

谢谢

【问题讨论】:

    标签: mysql database field database-design


    【解决方案1】:
    如果您使用 SHA1 哈希,

    'password' 应该是 char(40)。如果您确定散列的情况始终相同,这可能具有二进制排序规则。这为您提供了更好的性能。如果不是,请使用 latin1,但不要使用 utf8。

    'email'...使用 255,你无法知道某人的电子邮件地址有多长。

    对于用户名,我会使用您的最大用户名长度。 20 或 30 可能会很好。

    如果您在字符字段上有索引(特别是如果它是 PK 的一部分),请非常小心地选择长度,因为越来越长的索引可能会严重降低性能(并增加内存使用量)。

    另外,如果你在索引中使用 UTF8 字符字段,你必须知道,MySQL 保留的字节是字段实际字符长度的 3 倍,为最坏的情况做准备(UTF8 可能会在 3字节)。这也可能导致内存不足。

    【讨论】:

      【解决方案2】:

      如果您对这些字段中的任何一个进行索引(并且您不使用前缀作为索引),请记住 MySQL 会将字段索引为CHAR 而不是VARCHAR,并且每个索引记录将使用最大的潜在空间(VARCHAR(n) 需要 3n 个字节,因为 UTF8 字符最多可以有 3 个字节长)。这可能意味着该指数将超出必要的范围。要解决此问题,请缩小字段,或在前缀上编制索引。

      (我应该说:我确定我已经在 MySQL 文档的某个地方读到过这种情况,但是我刚才看的时候找不到。)

      【讨论】:

        【解决方案3】:

        更改不会对性能产生很大影响(取决于该表中有多少行 - 可能您不会注意到任何影响),但它可能会使您的数据库使用更少的磁盘空间。 (我使用长度为 30 的用户名,64 的密码(哈希长度)和 50 的电子邮件地址)。

        【讨论】:

        • 如果你有 utf8 字段是不够的
        猜你喜欢
        • 1970-01-01
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 2011-05-21
        相关资源
        最近更新 更多