使用以下列为名为user_movies的表创建索引是否有意义:
USER_ID movie_id
除了在此表上插入或更新之外,还有更多阅读,但我不知道该怎么做。另外:在这种情况下是否足以省略主键?
答案 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)
如果您使用这样的“连接表”,您可能会在查询中使用某些连接 - 这些连接可能会受益于这两列中每一列的索引(这意味着两个单独的索引)。