MongoDB$in运算符和复合索引

MongoDB$in运算符和复合索引,mongodb,indexing,Mongodb,Indexing,我有一个集合,按顺序在四个字段上使用复合索引:(a,B,C,D) 当我不喜欢的时候 find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N) 对于A、B、C字段中的严格相等,它运行得非常快,这是应该的。而且explain()告诉我只扫描了N个文档 如果我在操作符中更改一个等于$in(数组中有大约100个元素),它将扫描更多的文档,并且运行速度更慢: find({A: {$in: [val0, val1, ...]}, B: val2, C:

我有一个集合,按顺序在四个字段上使用复合索引:(a,B,C,D)

当我不喜欢的时候

find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N)
对于A、B、C字段中的严格相等,它运行得非常快,这是应该的。而且
explain()
告诉我只扫描了N个文档

如果我在操作符中更改一个等于
$in(数组中有大约100个元素),它将扫描更多的文档,并且运行速度更慢:

find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N)
其他操作符,如
$或
,具有相同的效果

从逻辑上讲,一个包含100个元素的
$in
必须与包含严格相等的100个单独查询非常相似。第二个变体在数据库中运行得更快,但需要通过客户端上的后期排序和限制获取所有元素(无限制)


$in
将这一个查询拆分为几个等于的查询,以使光标扫描的文档数减少,这有意义吗?如果集合中有数百万份文档,那么什么更有效率

你用索引{B:1,C:1,A:1,D:1}测试过吗?这样可以快速处理精确的B和C值,在a字段上可以使用一个范围,并且仍然可以通过索引进行D排序。

如文档所述,由于MongoDB v1.6.0,复合索引中字段的顺序不再重要:但是,我尝试了您的变体,没有任何更改。@DenisNP:如果您的意思是,那你就错了。字段的顺序在索引中并不重要。它只是说,您可以省略(索引定义)末尾的一些字段,而不会对性能造成严重影响。@SergioTulentsev:我的意思是。我错了吗?@DenisNP:那么,
explain()
说了什么?