Mongo - 复合索引与前缀的约束

时间:2015-04-10 07:12:27

标签: mongodb

From the Mongo docs:

  

如果您的集合在其前缀上同时包含复合索引和索引(例如{a:1,b:1}和   {a:1}),如果两个索引都没有稀疏或唯一约束,那么您可以删除前缀上的索引(例如{   a:1})。 MongoDB将在所有使用前缀索引的情况下使用复合索引。

约束如何产生影响?

1 个答案:

答案 0 :(得分:1)

最好通过矛盾的例子来解释。

1)假设您有一个稀疏的复合索引{a, b}和一个常规索引{a},那么文档

{ a : null, foo : "bar" }

不会成为稀疏索引的一部分,但会在常规{a}索引中编入索引。因此,使用稀疏索引无法找到{ a : null }的文档,但可以使用常规索引找到它们(作为旁注,如果存在许多此类文档,则树变得不平衡且速度慢。)

2)假设您有一个复合{a, b}索引和一个唯一的{a}索引,那么以下两个文档将违反{a}索引的唯一约束,但不会违反该复合词index,即使您将其转换为唯一索引:

{ a : 1, b : 1 }
{ a : 1, b : 2 }  // the {a,b} tuple is different, but a isn't unique

因此,唯一a索引的存在或不存在决定了是否可以插入第二个文档。

3)同样,{a, b}元组的唯一性并不仅仅意味着a的唯一性,等等。您可以找到所有组合的矛盾,除非两个索引既不稀疏也不具有唯一约束。