我有下面的表格,用于连接3个表:
ClientID int
BlogID int
MentionID int假设查询总是通过ClientID提供的,我可以创建一个多列索引(ClientID、BlogID、MentionID)。
问题是,是将其创建为聚集索引还是作为唯一键创建呢?据我所知,聚集索引将数据存储在其叶节点上。当然,在这种情况下,索引是数据,所以我不知道Server是否会复制数据。尽管如此,我在MSDN上找不到任何关于使用“唯一键”的重要性的东西。
这与Type = Index & IsUnique = yes有什么不同?
有人能告诉我每一种方式的优点吗?
发布于 2010-11-13 15:03:07
你似乎在问以下几个方面的区别:
MYTABLE
id integer primary key autoincrement
clientid integer
blogid integer
mentionid integer
-- with a unique composite index on (clientid, blogid, mentionid) and three foreign key constraints和
MYTABLE
clientid
blogid
mentionid
-- with a composite primary key on (clientid, blogid, mentionid) and three foreign key constraints和
MYTABLE
id integer primary key autoincrement
clientid integer
blogid integer
mentionid integer
with an index on clientid and also an index on blogid and the three foreign key constraints首先,在整数主键上有索引,在三位一体上也有可选的唯一索引。如果是第二个,则只有三进主键上的唯一索引。在第三部分中,整数主键上有一个唯一的索引,还有另外两个非唯一索引,一个在clientid上,另一个在blogid上。
第二种方案的效率稍高,其性能增益将是极小的,因此我将根据其他因素作出决定。第三种方法在查询方面是最灵活的,并且提供了更简单的编码;它提供了客户机和博客上的索引的好处,如果您想在WHERE子句中使用blog而不是client进行查询的话。至于编码,一些GUI工具和中间件在多部分主键方面有问题,当您的更新/插入/删除逻辑必须处理单个整数PK列时,它将变得更简单。我发现,代码简单和易于维护比几秒钟或仅仅几秒钟的查询响应时间的改进要好得多。
发布于 2010-11-13 14:55:41
聚集索引是“表本身”,即索引节点排列在一棵树中,其叶节点包含行数据。聚集索引不必声明为唯一的(尽管它通常是唯一的);如果它不是唯一的,则服务器将向该索引隐式添加一个"uniqalizer“,从而使每一行都被唯一标识。
其他索引将聚集索引值存储为它们的叶节点(如果其他列包含在中的INCLUDE子句中,则可能还存储一些其他列)。
任何索引都可能被取消为唯一索引,因此服务器将执行额外的检查,以防止重复值进入表中。
发布于 2010-11-13 14:39:23
unique index,unique key和unique constraint基本上是一样的。它们产生一个强制执行uniqueness.唯一和聚类是不相关的属性。你可以用任何你喜欢的方式组合它们。所以在你的例子中,我会创建一个唯一的聚集索引。通常的方法是将索引创建为clustered primary key。
https://stackoverflow.com/questions/4172974
复制相似问题