首页 > 解决方案 > MongoDB聚合查询性能提升

问题描述

我最近开始将数据从 Microsoft SQL Server 转移到 MongoDB 以获得可伸缩性。就移民而言,一切都很好。

该文档有 2 个重要字段:客户、timestamphash(年月日)。

我们在安装 MongoDB 的 Azure Linux 中仅导入了 7500 万个数据。在两个字段上添加复合索引后,我们遇到了以下问题:

在 3 百万数据上(过滤后),按 customerId 计数完成聚合组需要 24 秒。SQL Server 在不到 1 秒的时间内对相同的数据给出结果。

你认为 Casandra 会是一个更好的解决方案吗?我们需要对大量数据的查询性能。

我尝试了磁盘写入,为 VM 提供了更多 RAM。没有任何效果。

询问:

aaggregate([
{ "$match" : { "Customer" : 2 } }, 
{ "$match" : { "TimestampHash" : { "$gte" : 20160710 } } }, 
{ "$match" : { "TimestampHash" : { "$lte" : 20190909 } } }, 
{ "$group" : { "_id" : { "Device" : "$Device" }, "__agg0" : { "$sum" : 1 } } }, 
{ "$project" : { "Device" : "$_id.Device", "Count" : "$__agg0", "_id" : 0 } }, 
{ "$skip" : 0 }, 
{ "$limit" : 10 }])

更新: 我使用了“allowDiskUse:true”,问题就解决了。过滤 3M 数据的时间减少到 4 秒。

标签: mongodbperformanceindexingaggregation-framework

解决方案


我之前遇到过类似的问题,在这个问题中,老实说,我猜 Cassandra 在你的某些情况下更好,但问题是关于 Mongo 聚合查询优化,对吧?

就目前而言,我的一个集合拥有超过 300 万个文档,如果您正确构建索引,聚合查询不应该花费 24 秒。

  1. 首先,通过 Mongo Compass 查看索引使用情况。Mongo真的在使用它吗?如果您的应用程序spam查询数据库并且您index的使用量为 0(如下例所示),那么正如您已经猜到的那样,您的索引有问题。 在此处输入图像描述
  2. 第二件事是,使用explain方法(此文档将帮助您)查看有关您的query.

  3. 第三个:索引字段排序很重要。例如,如果您有$match3 个字段的阶段并且您按字段请求文档:

{ $match: {a_field:a, b_field:b, c_field:c} }

那么你应该compound以完全相同的顺序在 a、b、c 字段上建立索引。

总是存在某种数据库架构问题。我强烈建议您不要将stockpile所有数据放在一个集合中。{timestamps:true}在插入时使用(它创建了两个字段,例如createdAt:updatedAt:

        {
            timestamps: true
        }

在您的架构中,将旧时/过时的数据存储在不同的集合中,并在您确实需要对它们进行操作时为它们使用$lookup 聚合方法。

希望你能在我的回答中找到有用的东西。


推荐阅读