在MySQL数据透视表中使用自动递增主键有什么好处吗?

时间:2014-04-18 12:18:58

标签: mysql performance

想象一下,我们在MySQL数据库中有三个表:

  • 帖子
  • 类别
  • category_post

帖子类别之间存在一对多关系,因此单个帖子可能包含多个类别。

category_post 表是类别帖子之间的数据透视表,其中包含以下列:

  • id(主键,自动递增,大整数)
  • CATEGORY_ID
  • POST_ID

让我们假设我们的 category_post 表中有1,000,000行。

我的问题是:

category_post 表中使用 id 列是否有任何性能优势,还是只占用额外空间?

3 个答案:

答案 0 :(得分:7)

帖子和类别可能是多对多,而不是一对多。

多对多关系表最好像

那样
CREATE TABLE a_b (
a_id ... NOT NULL,
b_id ... NOT NULL,
PRIMARY KEY (a_id, b_id),
INDEX(b_id, a_id) -- include this if you need to go both directions
) ENGINE = InnoDB;

通过这种方式,您可以自动获得两个方向的“聚集”查找,并避免表格中不必要的人工ID。

(顺便说一下,N.B。,一个隐含的PK是6个字节,而不是8. Jeremy Cole在这个主题上有一篇很长的帖子。)

一对多关系不需要这个额外的表。相反,在另一个表中有一个id。例如,City表将包含其中Country的ID。

答案 1 :(得分:5)

将category_id和post_id作为复合主键将具有比将额外id作为主键更好的性能。这是因为将其作为主键也会自动在其上创建index。如果您真的需要额外的Id列,可以通过在category_id和post_id上手动定义索引来提高性能。有一个额外的关键列没有任何好处,这通常是一个不好的做法。

答案 2 :(得分:1)

没有id是好的,但是当你关心通过数据透视表进行排序时,你需要在数据透视表中有id或时间戳