MongoDB$nin查询优化



我有一个MongoDB集合,它有大约500万个文档。文档中的数据如下所示:

{
since: [Some Unix timestamp ie. 1660106561)
team: ["a","b","c]
}

当我运行以下查询时,我的mongoDB连接超时:

db.myCollection.find({team: {$nin: ['b']}}).sort({since: -1})

我的收藏中有以下复合索引:

[自,团队]

我能做些什么来防止这个查询超时吗?

这个查询很难执行,$nin是一个非选择性查询,这意味着它不能很好地利用索引。

例如,不等式运算符$nin和$ne不是很有选择性,因为它们通常与索引的很大一部分匹配。因此,在许多情况下,带索引的$nin或$ne查询的性能可能并不比必须扫描集合中所有文档的$nin或$ne搜索好。

特别是在这种情况下,我认为索引甚至会损害查询性能,因为索引是一个使用$nin的多关键字索引,它仍然强制扫描索引树的大部分,之后查询引擎仍然必须提取和筛选每个文档,以确保它没有B值。如果这只是一个玩具的例子,价值观的肉欲甚至更大,那么表现可能会变得更糟。基本上迫使发动机做双重功。

我认为,如果你在没有任何索引使用的情况下执行这个查询,或者如果";因为";日期与";narutal";订单,你可以放弃跳过,你可以得到更好的性能,如下所示:

db.collection.find({team: {$nin: ['b']}}).sort({$natural: -1}).hint({$natural: 1});

请注意,任何需要扫描数百万文档的查询都不会有闪电般的执行速度。

最新更新