我应该为多对多数据库表使用索引吗?

时间:2010-01-04 23:36:27

标签: mysql database indexing

使用以下列为名为user_movies的表创建索引是否有意义:

USER_ID movie_id

除了在此表上插入或更新之外,还有更多阅读,但我不知道该怎么做。另外:在这种情况下是否足以省略主键?

4 个答案:

答案 0 :(得分:10)

此表的正确定义如下:

CREATE TABLE user_movies (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  PRIMARY KEY (user_id, movie_id),
  FOREIGN KEY (user_id) REFERENCES users(user_id),
  FOREIGN KEY (movie_id) REFERENCES movies(movie_id)
) ENGINE=InnoDb;

注意“主键”是约束,而不是列。最佳做法是在每个表中都有一个主键约束。不要将主键约束与自动生成的伪键列混淆。

在MySQL中,声明外键或主键会隐式创建索引。是的,这些都是有益的。

答案 1 :(得分:1)

我会单独索引两列,是的,你可以删除主键。

答案 2 :(得分:1)

我一直听说你应该在BOTH列上创建唯一索引,首先是单向(user_id + movie_id),然后是另一种方式(movie_id + user_id )。通过一些快速而肮脏的测试,它在我的应用程序中的工作速度稍快(不多,大约10-20%)。

它还确保您不能有两行将相同的movie_id绑定到同一user_id(这可能很好,但可能并非总是如此)。

答案 3 :(得分:0)

如果您使用这样的“连接表”,您可能会在查询中使用某些连接 - 这些连接可能会受益于这两列中每一列的索引(这意味着两个单独的索引)。