【发布时间】:2011-06-10 12:28:24
【问题描述】:
在这样的典型多对多排列中......
电影演员 Movies_Actors ------ ------ ------------- movie_ID actor_ID FK_movie_ID 标题名称 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)
)
但是,这似乎索引仅在搜索 both movie_ID 和 actor_ID 时才有用(尽管我不确定复合索引是否也适用于各个列)。
由于“电影 X 中有哪些演员”和“演员 Y 出演了哪些电影”都是该表的常见查询,因此似乎每列都应该有一个单独的索引来快速定位演员和电影他们自己。复合索引是否有效地做到了这一点?如果没有,那么在此表上使用复合索引似乎毫无意义。如果复合索引没有意义,那么主键该怎么办?候选键显然是两列的组合,但如果生成的组合索引毫无意义(它一定不是?),这似乎是一种浪费。
此外,this link 增加了一些混淆,并表明实际上指定 两个 复合索引甚至可能有用...其中一个为 (FK_movie_ID, FK_actor_ID),另一个相反为 @ 987654328@,可以选择哪个是主键(因此通常是聚集的),哪个“只是”一个唯一的复合索引,基于哪个方向被查询更多。
真实的故事是什么?复合索引是否会自动有效地索引每一列以在其中一个或另一个上进行搜索?最佳(读取速度,而不是大小)关联表是否应该在每个方向上都有一个复合索引并且在每一列上都有一个?幕后机制是什么?
编辑:我发现了这个相关的问题,由于某种原因我在发布之前没有找到...... How to properly index a linking table for many-to-many connection in MySQL?
【问题讨论】:
-
非常有趣的问题,相信很多人都错了。
标签: sql sql-server postgresql many-to-many query-optimization