在一个典型的很多很多这样的安排...
Movies Actors Movies_Actors ------ ------ ------------- movie_ID actor_ID FK_movie_ID title name FK_actor_ID
... 关联表('Movies_Actors'
)应该如何索引以获得最佳读取速度?
我通常认为,这只能通过关联表中的复合主键来实现,如下所示:
CREATE TABLE Movies_Actors (
FK_movie_ID INTEGER,
FK_actor_ID INTEGER,
PRIMARY KEY (FK_movie_ID, FK_actor_ID)
)
然而,这似乎只有在搜索bothmovie_ID
和actor_ID
时索引才有用(尽管我不确定复合索引是否也适用于单个列).
由于"电影X中的演员是什么"和"演员Y中的演员是什么电影"将是此表的常见查询,因此似乎每个列上都应该有一个单独的索引,以便快速查找演员和电影.综合指数能有效地做到这一点吗?如果没有,那么在这个表上,拥有一个复合索引似乎毫无意义.如果复合索引没有意义,那么主键该怎么办?候选键显然是两列的组合,但如果生成的组合索引是无意义的(一定不是吗?)这似乎是浪费.
此外,this link增加了一些混乱,并表明它甚至可能有助于实际指定two个综合指数...其中一个是(FK_movie_ID, FK_actor_ID)
,另一个是(FK_actor_ID, FK_movie_ID)
, Select 哪个是主键(因此通常是聚集的),哪个"只是"一个唯一的复合索引,根据哪个方向查询更多.
真实的故事是什么?复合索引是否会自动有效地索引每一列,以便在其中一列上搜索?最佳(以读取速度,而不是大小)关联表是否应该在每个方向上都有一个复合索引,每列上有一个索引?什么是幕后机制?
编辑:我发现了这个相关的问题,出于某种原因,我在发布之前没有找到它...