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

Rup*_*ert 7 mysql performance

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

  • 帖子
  • 类别
  • category_post

帖子类别之间存在一对多的关系,因此单个帖子可能有许多类别.

所述category_post表之间的枢转表的类别职位和具有以下的列:

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

我们还想象一下,我们的category_post表中有1,000,000行.

我的问题是:

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

Ric*_*mes 8

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

多对多关系表最好像这样做

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;
Run Code Online (Sandbox Code Playgroud)

这样,您可以自动获得两个方向的"群集"查找,并避免表格中不必要的人工ID.

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

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


Gle*_*mme 5

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