我有一个MongoDB集合,其中包含游戏中用于配对的记录。我在进行这样的查询,以使用户处于特定得分范围内,针对特定游戏模式,并按ID升序排序(这使我获得了较早的记录):
db.matchmaking.find({matchmakingId:“ test”,得分:{$ lte:2000,$ gte:400}})。sort({_id:1})
因为可能有很多记录,所以我创建了此索引以使查询更快:
matchmakingId_1_score_-1_id_1
使用“ explain()”方法,我可以验证上面的查询正在使用我的索引。它执行IDXSCAN(我的索引)-> FETCH(无过滤器)-> SORT_KEY_GENERATOR-> SORT->完成。
但是,我还想将返回的文档数限制为10个。因此,我添加了limit方法:
db.matchmaking.find({matchmakingId:“ test”,得分:{$ lte:2000,$ gte:400}})。sort({_id:1})。limit(10)
当我现在使用“ explain()”时,它不再使用我的索引!相反,它使用以下计划:IDXSCAN(_id)-> FETCH(对matchmakingId,score进行过滤)-> LIMIT。
因此,这引发了几个问题:
1)为什么添加“ limit()”方法会导致计划发生如此大的变化?
2)“ limit()”版本实际上更有效吗?还是这取决于数据库中的记录量?
3)如果我将使用“ limit()”这样的方式访问这些记录,是否值得维护索引?还是不使用?