【问题标题】:MongoDB - very slow query execution when collation is setMongoDB - 设置排序规则时查询执行非常慢
【发布时间】: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#代码或直接在数据库上运行查询没有区别,执行时间非常相似。

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/questions/57487947/…
  • db.getCollection('persons').aggregate([ { "$match" : { "personIdCardNumber" : "xxx" } } ],( { collat​​ion: { "locale" : "pl" , "strength" : 2, "numericOrdering" : "false"}})) 和 db.getCollection('persons').find({personIdCardNumber: "XXXX"}).collat​​ion( { "locale" : "pl", "strength" : 2, "numericOrdering" : false}) 时间:30s vs 15s。查找肯定更快,但没有排序规则,我的时间不到 1 秒。也许问题是索引(personIdCardNumber)默认包含英语集合?那么也许解决方案是使用 PL 排序规则重新创建索引?
  • 我看到当我使用排序规则时,查询使用 collscan(检查所有 42kkk 记录),没有排序规则,查询使用 ixscan 并使用索引。
  • 是的,您可以尝试重新创建索引并验证解释计划
  • 使用您用于查询的排序规则创建索引。

标签: c# mongodb azure-cosmosdb asp.net-core-5.0


【解决方案1】:

我将上述 cmets 转换为答案,因此这可能对其他社区成员有所帮助:

正如 cmets 中所讨论的,使用排序规则重新创建索引后,您的问题已成功解决。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2023-04-08
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多