是否有推荐的Mysql主键大小

时间:2012-12-21 20:08:22

标签: mysql database-design primary-key

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

将此作为primary key使用会被视为不良做法吗?主键有推荐的大小,数据类型吗?

6 个答案:

答案 0 :(得分:5)

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

如果可能,最好使用自动增量整数键,只需在哈希标识符列上创建唯一索引。

答案 1 :(得分:1)

取决于 tm ;)

根据您的描述判断,此字段是您的数据固有的,必须是唯一的。如果确实如此,那么必须使其成为关键。如果您有子表,请考虑引入另一个,所谓的“代理”键只是为了让孩子FK更苗条并且可能避免ON UPDATE CASCADE。但请注意,每个额外的索引都会引入开销,尤其是clustered tables。有关代理键的更多信息here

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用它作为PKEY没有任何内在错误。如果你有许多其他表使用它作为FKEY,也许不是。没有人回答。

另请注意,如果您知道它总是正好是32个字符,那么您应该将其设为CHAR(32)。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这个关键因为几个原因而不好。

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