我有一个表必须在mysql中存储数百万个帖子(在不久的将来)。这是简化的结构(我没有指出我的主键,因为我的问题是基于那个):
CREATE TABLE `posts` (
`post_id` INT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT(20) NOT NULL,
`title` VARCHAR(100),
`content` TEXT
) ENGINE = MyISAM;
我的问题是:定义我的密钥的最佳方法是什么?
考虑到需要存储的记录数量,最好仅将AUTO_INCREMENT
'post_id
'用作主键和唯一键吗?
我必须同时使用“post_id
”和“user_id
”作为复合键才能用作主键和唯一键吗?如果这是最好的,我如何在其他表中使用它作为外键?我只是将它们作为列添加到这些表中吗?
请您说明每种方法的优缺点(如果有的话),也许还有一些关于使用哪种引擎的建议。我认为如果我使用第二个选项,Innodb将是最好的。我不知道。
答案 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字段太小了)。