mongodb稀疏索引和分片键

时间:2012-12-20 23:51:44

标签: mongodb indexing sharding nosql

我查看了文档,但找不到明确的答案

假设我在[a,b,c]

上有一个稀疏索引
  1. 将带有“a”“b”字段但不是“c”的文档插入索引吗?

  2. 在最新的mongodb版本中是否必须将分片键编入索引?

  3. 如果是这样,是否可以使用上述复合稀疏索引对[a]进行分片? (说a,b将永远存在)

1 个答案:

答案 0 :(得分:0)

  1. 如果c不存在,并且查询在查询计划中使用c索引,则找不到文档,因为索引中不存在该文档。
  2. 分片键必须编入索引并且是唯一的。另请查看the sharding reference docshard key上的说明,它说
  3.   

    理想的分片键:

         

    很容易被分割,这使得MongoDB很容易分发   碎片中的内容。分片数量有限的分片键   可能的值并不理想,因为它们可能导致一些块   是“不可分割的”。有关更多信息,请参阅基数部分。   将在集群之间分配写操作,以防止任何   单个碎片成为瓶颈。具有高的碎片键   因此,与插入时间的相关性是不好的选择;   但是,具有更高“随机性”的分片键满足此要求   要求更好。有关其他信息,请参阅Write Scaling部分   背景。将使mongos可以返回大多数查询   直接从单个特定mongod实例进行操作。你的碎片   key应该是查询使用的主要字段,以及字段   由于这个原因,高度的“随机性”是糟糕的选择。看到   查询隔离部分用于特定示例。

    所以如果假设,如果mongo接受稀疏索引作为分片键,mongo将不知道在哪里放置不适合索引的文档。有人可以说,为了这个目的,把它们全部放在另一个碎片中。反驳的论点是,如果它超出了会发生什么......因此我认为这样做是不合理的,即使它是允许的。

    3-我怀疑稀疏索引是否有效,因为分片需要唯一索引且稀疏索引不符合条件。唯一的索引要求,我没有在文档中找到,但如果你使用mongo admin shell帮助,它会告诉你它。