0

跨分片的集合中将有大约 30 亿个文档。假设我将使用不完全由索引完成的查询。而且我没有使用按键进行排序。

具有以下索引是否有意义(与查询匹配):

{"sid":1, "cid":1, "mid":1}
{"cid":1, "hid":1, "mid":1}
{"mid":1, "hid":1, "sid":1}
{"hid":1, "sid":1, "cid":1, "mid":1}
{"mid":1, "cid":1}
{"mid":1, "sid":1}

或者:

{sid:1}
{cid:1}
{hid:1}
{mid:1} 
4

1 回答 1

1

这是一个有效的问题。您没有使用这些键进行排序,所以我假设您的查询不包含排序,因为您必须知道(已经说过您做了什么)索引交叉不能跨排序工作。

我会说:最好有复合索引

尽管要维护的索引更多,但它可以直接回答您的查询,而无需进行交叉计算所需的有问题的计算。我的意思是你在 3.5b 条记录上做这件事,结果不会很好。

复合索引方法将维护的权重放在插入/更新方面,这比查询方面要好得多。即使索引在任何给定时间点仅部分满足查询。

看来 MongoDB 的交集变得更高级了:

一般来说,每个索引交集涉及两个索引;但是,MongoDB 可以使用多个/嵌套索引交集来解析查询。

http://docs.mongodb.org/manual/core/index-intersection/

因此,即使它可以使用两个以上的索引,但使用 3 个交叉点仍然会导致嵌套交叉点的出现,这听起来并不愉快。

前段时间我确实回答了一个类似的问题,据 10gen 所说,交叉路口本质上是最后的手段,而不是可取的东西。

于 2015-05-05T21:27:24.457 回答