想要了解以下案例中MongoDB集合的最佳索引的一些信息吗

想要了解以下案例中MongoDB集合的最佳索引的一些信息吗,mongodb,indexing,Mongodb,Indexing,我有一组对象,上面有4个ID,类似于: { location_id : ObjectId, project_id : ObjectId, department_id : ObjectId, element_id : ObjectId } 我的数据服务中有一个专门的端点,它接收这些对象的数组,并且必须返回集合中ID匹配的所有对象,但数据库中的null始终是匹配的 在我看来,这不是一个困难的问题,但我最关心的是性能。如果我只是索引所有4个ID,mongo是否足够聪

我有一组对象,上面有4个ID,类似于:

{ 
    location_id : ObjectId,
    project_id : ObjectId,
    department_id : ObjectId,
    element_id : ObjectId
}
我的数据服务中有一个专门的端点,它接收这些对象的数组,并且必须返回集合中ID匹配的所有对象,但数据库中的null始终是匹配的


在我看来,这不是一个困难的问题,但我最关心的是性能。如果我只是索引所有4个ID,mongo是否足够聪明,能够有效地处理所有4个ID上的查询?此集合中可能有数亿条记录,传入集合中可能有数百条记录可供查询。是否有一种更有效的二级索引方法,或者仅仅对所有4个索引进行索引就足以让mongo的引擎解决问题?

对所有4个索引进行索引就足够了,但是根据系统将执行的典型查询类型,您有一些选项

如果您的查询总是在同一个查询中搜索所有4个字段,那么all in索引就足够了

现在,如果字段之间有组合,则可以为每个查询定制额外的索引,如:

db.collection.find({ location_id : ObjectId, project_id : ObjectId });
//index: { location_id : 1, project_id : 1 }

db.collection.find({ location_id : ObjectId, department_id : ObjectId });
//index: { location_id : 1, department_id : 1 }

db.collection.find({ project_id : ObjectId, element_id : ObjectId });
//index: { project_id : 1, element_id : 1 }

...
在幕后,MongoDB将在最初的几个查询中测试每个可能的索引,并决定哪个索引对于特定的查询具有更好的性能

我通常做的是将日志查询的速度降低到100ms以下,然后为每种情况创建必要的索引

要激活探查器,请在mongo shell上运行:

db.setProfilingLevel(
  1, //0-turn off profiler; 1-log only slow than slowms; 2-log all operations
  { slowms: 100 } //slow than 100ms
);
然后检查较慢的查询:

db.system.profile.find().sort({millis:-1}).limit(10).pretty();