提问者:小点点

mongodb复合索引与索引相交


跨碎片的集合中将有大约30亿个文档。假设我将使用不完全由索引(es)实现的查询。我也不是用键来排序的。

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

{"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} 

共1个答案

匿名用户

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

我会说:最好是复合索引。

尽管需要维护更多的索引,但它可以直接回答您的查询,而无需进行分段间所需的有问题的计算。我的意思是,你做了超过35亿的记录,这不会有好的结果。

复合索引方法将维护的权重放在插入/更新端,这比查询端要好得多。即使索引在任何给定时间点只完成部分查询也是如此。

似乎Mongodbs的相交得到了更高级的:

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

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

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

前一段时间,我确实回答了一个类似的问题,根据10Gen的说法,区间分割本质上是最后的手段,而不是可取的。