在这种情况下,自然键和复合键之间的优点是什么

时间:2012-01-08 19:49:08

标签: mysql innodb myisam key composite-primary-key

我有一个表必须在mysql中存储数百万个帖子(在不久的将来)。这是简化的结构(我没有指出我的主键,因为我的问题是基于那个):

CREATE TABLE `posts` (
    `post_id` INT NOT NULL AUTO_INCREMENT,
    `user_id` BIGINT(20) NOT NULL,
    `title` VARCHAR(100),
    `content` TEXT
) ENGINE = MyISAM;

我的问题是:定义我的密钥的最佳方法是什么?

  1. 考虑到需要存储的记录数量,最好仅将AUTO_INCREMENT'post_id'用作主键和唯一键吗?

  2. 我必须同时使用“post_id”和“user_id”作为复合键才能用作主键和唯一键吗?如果这是最好的,我如何在其他表中使用它作为外键?我只是将它们作为列添加到这些表中吗?

  3. 请您说明每种方法的优缺点(如果有的话),也许还有一些关于使用哪种引擎的建议。我认为如果我使用第二个选项,Innodb将是最好的。我不知道。

1 个答案:

答案 0 :(得分:1)

使用自动递增的字段作为主键还是使用post_id和user_id的复合键将基本上归结为:

如果您的posts表中有子表,您是否希望使用帖子的user-id查询这些表?

例如,如果允许其他用途对帖子发表评论,并且您有一个comments表,您是否看到了为什么要从查询{{{{ 1}}原帖?

如果是这样,通过使用自动递增的字段,您总是必须加入父表(user_id),以便根据{{1}查询子表上的数据}:

posts

这可能会导致性能下降,尤其是如果您希望user_id表中有数百万行数据。

如果您不需要使用SELECT comments.* FROM comments INNER JOIN posts ON posts.post_id=comments.post_id WHERE posts.user_id='scott.korin' 字段查询子表,那么我将使用自动递增的posts只要确保你定义足够大的字段。(如果你除了数百万条记录外,你不希望最多只有几百万条记录,因为你使post_id字段太小了)。