是否应将主键添加到innodb表中?

时间:2012-06-24 09:42:36

标签: mysql database database-design indexing database-optimization

我有一些innoDbs只有2个int列,它们是其他表主键的外键。

例如,一个表是user_items,它有2列,userId,itemId,用户和项目表的外键,如果更新或删除,则设置为级联。

我应该在这些表中添加第3列并将其作为主键,还是在性能或任何其他好处方面,它现在的方式更好?

3 个答案:

答案 0 :(得分:6)

仅仅为了添加ID列而添加第三个ID列是没有意义的。实际上,当您插入或删除行时,它只会增加处理开销(索引维护)。

主键不一定是“ID列”。

如果您只允许在用户和项目之间关联一个(用户不能两次分配相同的项目),那么将(userid, itemid)定义为表的主键是有意义的。

如果你允许同一对出现不止一次,那么你当然不需要那个约束。

答案 1 :(得分:2)

您已拥有自然键{userId, itemId}。除非有特定原因要添加另一个(代理)密钥,否则只需将现有密钥用作主密钥。

代理人的一些原因可能包括:

  • 让孩子FK“更苗条”。
  • 消除儿童级联更新。
  • ORM友好性。

我认为这不适用于您的情况。

另外,请注意InnoDB tables are clustered和群集表中的二级索引比基于堆的表中的二级索引更昂贵。理想情况下,你应该尽可能避免使用二级索引。

答案 2 :(得分:0)

一般情况下,如果它没有为您正在编写的代码添加真正的复杂性,并且该表预计包含100,000-500,000行或更少,我建议添加主键。我有时也建议添加created_atupdated_at列。

是的,它们需要更多存储 - 但它是最小的。还存在必须维护主键索引的问题,因此如果表变大,插入和更新可能会更慢。但除非表格很大(100或数千或数百行),否则处理速度可能没有差别。

因此,除非表格非常大,否则对空间和处理速度的影响微不足道 - 因此您需要决定维护它所需的工作量以及它提供的潜在效用。如果只需要很少的额外代码,那么它提供的几乎任何实用程序都可能使它值得。

拥有主键的最佳理由之一是根据插入的顺序为行提供自然顺序。如果您想要检索添加的最后100行(或前100行),如果您在表上有自动增量主键,则非常简单快速。

添加inserted_atupdated_at列可以在根据日期范围提取数据方面提供类似的效用。同样,除非行数非常大,否则也值得对它们进行评估。