【问题标题】:Is there a recommended size for a Mysql Primary keyMysql 主键是否有推荐的大小
【发布时间】:2012-12-09 09:54:49
【问题描述】:

'projects' 表中的每个条目都有一个唯一的 32 个字符的哈希标识符,使用 varchar(32) 存储。

将其用作 primary key 会被认为是一种不好的做法吗?是否有推荐的主键大小和数据类型?

【问题讨论】:

标签: mysql database-design primary-key


【解决方案1】:

我会说是的,将这么大的列用作主键是个坏主意。原因是您在该表上创建的每个索引都将包含 32 个字符的列,这会使所有索引的大小膨胀。更大的索引意味着更多的磁盘空间、内存和 I/O。

如果可能,最好使用自增整数键,并简单地在哈希标识符列上创建唯一索引。

【讨论】:

    【解决方案2】:

    取决于tm ;)

    根据您的描述,该字段是您的数据所固有的,并且必须是唯一的。如果确实如此,那么您必须将其设为密钥。如果您有子表,请考虑引入 another,即所谓的“代理”键,以保持子 FK 更苗条,并可能避免 ON UPDATE CASCADE。但请注意,每个额外的索引都会引入开销,尤其是对于 clustered tables。更多关于代理键here

    另一方面,如果此键不是您的数据模型固有的,请将其替换为较小的键(例如自动递增整数)。您将节省一些磁盘空间并(更重要的是)提高缓存的有效性。

    【讨论】:

      【解决方案3】:

      如何定义主键取决于您的使用情况。我通常使用 INT(11) 作为主键。它使外键变得非常容易。

      我刚刚看到你的编辑。我个人会使用带有自动增量的 int(11)。根据您的设置,这将允许您非常轻松地拥有具有外键约束的其他表。你可以用 varchar 做同样的事情,但我一直认为 int 比 varchar 快,尤其是索引。

      【讨论】:

      • 您是否知道 (11) 部分在这种情况下根本没有任何用处?只需使用 int
      • 是的,只是习惯在我的查询中写 int(11)
      【解决方案4】:

      将其用作 PKEY 本身并没有错。如果您有许多其他表将其用作 FKEY,则可能不会。没有一个答案。

      另外请注意,如果您知道它总是正好是 32 个字符,则应该改为 CHAR(32)。

      【讨论】:

        【解决方案5】:

        在数据库引擎中,最重要的一项是磁盘空间。通过减少数据库传输和传输的数据量,保持小而紧凑的数据通常与良好的性能相关联。如果表将有几行,则没有理由定义 INT 类型的 PK;可以使用 MEDIUMINT、SMALLINT 甚至 TINYINT 代替(就像使用 DATE 代替 DATETIME 一样),一切都是为了保持简洁。

        【讨论】:

          【解决方案6】:

          这个键不好有几个原因。

          • @Eric 解决了一个问题,因为每个二级索引都将包含相同的 32 个字符
          • 主键往往用于从其他表中查找,并且这些表也需要有这 32 个字符,也许在主键中,同样的问题会在这些表上再次出现。
          • 我能想到的最大原因是性能。当您插入散列类型的记录时,您基本上是以随机顺序插入键,这反过来最终会导致大量页面拆分和仅填充 50% 到 90% 的页面。这会导致不必要的深度树、更长的搜索时间、更大的表空间以及索引占用更多内存。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-06
            • 1970-01-01
            • 2018-01-10
            • 1970-01-01
            • 1970-01-01
            • 2012-07-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多