【发布时间】:2021-10-22 00:24:41
【问题描述】:
我在 mongodb 上执行非常慢的查询时遇到问题。 一般来说,我有个人收藏,每个人(大约 40000000 条记录)都有一些文件(一些)。 我想为具体的人获取文件,对它们进行排序,最后只得到一页项目。
查询如下:
db.getCollection('persons').aggregate([
{ "$match" : { "personIdCardNumber" : "XXXXX" } },
{ "$unwind" : "$documents" },
{ "$match" : { } },
{ "$sort" : { "documents.submitDate" : -1 } },
{ "$skip" : 0 },
{ "$limit" : 11 },
{ "$group" : { "_id" : "$_id", "documents" : { "$push" : "$documents" } } }
],(
{ collation: { "locale" : "pl"}}))
当我删除展开、排序、分组等时,查询也很慢。当我删除排序规则时,查询变得非常快(从 12 秒到 ~ 50 毫秒)。当我为“en”设置排序规则时,查询速度有点快,但仍然很慢(“pl”约 12 秒,“en”约 8 秒)
如果有人知道我可以做些什么来进行排序并提供更好的性能?
至于我的 c# 代码是:
collection.AggregateWithCollation()
.Match(x => x.personIdCardNumber == idCardNumber)
.Unwind(x => x.Documents)
.Sort(sort)
.Skip((page - 1) * pageSize)
.Limit(pageSize + 1)
.Group(group)
.FirstOrDefaultAsync(cancellationToken);
如果我运行c#代码或直接在数据库上运行查询没有区别,执行时间非常相似。
【问题讨论】:
-
db.getCollection('persons').aggregate([ { "$match" : { "personIdCardNumber" : "xxx" } } ],( { collation: { "locale" : "pl" , "strength" : 2, "numericOrdering" : "false"}})) 和 db.getCollection('persons').find({personIdCardNumber: "XXXX"}).collation( { "locale" : "pl", "strength" : 2, "numericOrdering" : false}) 时间:30s vs 15s。查找肯定更快,但没有排序规则,我的时间不到 1 秒。也许问题是索引(personIdCardNumber)默认包含英语集合?那么也许解决方案是使用 PL 排序规则重新创建索引?
-
我看到当我使用排序规则时,查询使用 collscan(检查所有 42kkk 记录),没有排序规则,查询使用 ixscan 并使用索引。
-
是的,您可以尝试重新创建索引并验证解释计划
-
使用您用于查询的排序规则创建索引。
标签: c# mongodb azure-cosmosdb asp.net-core-5.0