我按顺序在四个字段上有一个复合索引的集合:(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)
$or
等其他运营商具有相同的效果。
逻辑上,一个包含100个元素的$in
必须与具有严格等于的100个单独查询非常相似。第二个变体在数据库中的运行速度要快得多,但需要通过后期排序和限制客户端来获取所有元素(没有限制)。
将这个带$in
的查询拆分成几个等于使光标扫描的文件数量减少的查询是否有意义?如果收藏中有数百万份文件,会有什么效率?
答案 0 :(得分:2)
您是否使用索引{B:1,C:1,A:1,D:1}进行了测试?这样可以快速处理确切的B和C值,可以在A字段上使用范围,也可以通过索引进行D排序。