如何正确索引多个关联表?

在一个典型的很多很多这样的安排

电影演员电影演员
------       ------       -------------
电影ID演员ID FK电影ID
标题名称FK\U演员\U ID

。。。关联表('Movies\u Actors')应该如何索引以获得最佳读取速度

我通常只看到关联表中的复合主键可以完成此操作,如下所示:

创建表电影\u演员(
FK_电影_ID整数,
FK_actor_ID整数,
主键(FK_电影ID、FK_演员ID)
)

然而,这似乎只有在搜索电影ID和演员ID时,索引才有用(尽管我不确定复合索引是否也适用于各个列)

由于“演员在电影X中是什么”和“演员Y在电影中是什么”将是此表的常见查询,因此似乎每个列上都应该有一个单独的索引,以便快速查找演员和电影。综合指数能有效地做到这一点吗?如果没有,在这个表上使用复合索引似乎毫无意义。如果一个复合索引是无意义的,那么如何处理主键呢?候选键显然是两列的组合,但如果生成的组合索引是无意义的(一定不是吗?),那就好像是浪费

此外,此链接还增加了一些混淆,并表明它甚至可能有助于实际指定两个综合指数。。。其中一个是(FK\u movie\u ID,FK\u actor\u ID),另一个相反的是(FK\u actor\u ID,FK\u movie\u ID),其中的选择是主键(因此通常是聚集的),并且“只是”一个唯一的复合索引,它基于哪个方向进行更多的查询

真实的故事是什么?复合索引是否会自动有效地索引每一列,以便在其中一列或另一列上进行搜索?最佳(以读取速度,而不是大小)关联表是否应该在每个方向上都有一个复合索引,并且在每个列上都有一个?什么是幕后机制


编辑:我发现了这个相关的问题,出于某种原因,我在发布之前没有找到它。。。
如何为MySQL中的多对多连接正确索引链接表

(虽然我不确定
综合指数也适用于
单个列)

是的,它可以。但只有前缀:http://use-the-index-luke.com/sql/where-clause/the-equals-operator/concatenated-keys

此外,这个链接还增加了一些混乱
并表明它甚至可能是
实际指定两个
综合指数。。。其中一个是
(FK_电影ID、FK_演员ID)和
另一个相反,如(FK_actor_ID,
FK_电影_ID)

这才是真正需要做的

将一个作为集群索引,另一个作为非集群索引,无论如何都会包含集群索引键——因此无需再次包含该列(thx到JNK)

在电影演员(fk电影演员id,fk演员id)上创建聚集索引a;
在电影演员(fk演员id)上创建非聚集索引b;

真实的故事是什么

http://Use-The-Index-Luke.com/ :)

复合索引是否自动生成
有效地为每个列建立索引
搜索一个还是另一个

否。仅索引的前缀。如果您有一个索引(a,b,c),那么查询a=?b=?可以使用索引。然而c=?不能,b=?和c=

应该是最佳的(在读取速度,而不是
大小)关联表有一个
各方向的综合指数和
每列一个

如果您需要在两个方向上进行连接,请选择“是”(“每个方向上的复合索引”)和“否”(“每列上一个”)

什么是幕后机制

好吧,还是同一个链接

SQL Server,您可能最终也会考虑索引视图。这是一种预加入。如上所述,两个索引也可能足够快

发表评论