MongoDB первый запрос занимает время в Java Spring Boot приложении - PullRequest
1 голос
/ 05 марта 2020

У меня следующий код java spring mongoDB:

startTime = System.currentTimeMillis();
AggregationResults<MyClass> list = mongoTemplate.aggregate(Aggregation.newAggregation(operations),
    "Post", MyClass.class);
System.out.println("Time taken for query execution ->  "
    + (System.currentTimeMillis() - startTime));

, когда я тестирую этот код с использованием jmeter, первое выполнение показывает:

Time taken for query execution ->  3275 ('list' has 16 records)

На 2-м и далее запросите его

Time taken for query execution ->  355 ('list' has 16 records)

Разница во времени огромна. Как я могу улучшить его при первом вызове?

Когда я делаю Aggregation.newAggregation(operations).toString(), я получаю следующий запрос. Выполнение следующего запроса агрегации по команде оболочки всегда занимает около .350sec.

{
  "aggregate": "__collection__",
  "pipeline": [
    {
      "$match": {
        "$and": [
          {
            "postType": "AUTOMATIC"
          }
        ]
      }
    },
    {
      "$project": {
        "orders.id": 1,
        "postedTotals": 1
      }
    },
    {
      "$unwind": "$orders"
    },
    {
      "$group": {
        "_id": "$orders.userId",
        "ae": {
          "$addToSet": "$orders.userId"
        }
      }
    },
    {
      "$sort": {
        "ae": 1
      }
    }
  ]
}

.explain().aggregate( показывает следующее:

/* 1 */
{
    "stages" : [ 
        {
            "$cursor" : {
                "query" : {
                    "$and" : [ 
                        {
                            "postType" : "AUTOMATIC"
                        }
                    ]
                },
                "fields" : {
                    "headerPostedTotals" : 1,
                    "orders.UserId" : 1,
                    "_id" : 1
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "post",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "postType" : {
                            "$eq" : "AUTOMATIC"
                        }
                    },
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {
                                "postType" : 1,
                                "orders.UserId" : 1,
                                "orders.flightStartDateForQuery" : 1,
                                "orders.flightEndDateForQuery" : 1,
                                "postRunDate" : -1
                            },
                            "indexName" : "default_filter_index",
                            "isMultiKey" : true,
                            "multiKeyPaths" : {
                                "postType" : [],
                                "orders.UserId" : [ 
                                    "orders"
                                ],
                                "orders.flightStartDateForQuery" : [ 
                                    "orders"
                                ],
                                "orders.flightEndDateForQuery" : [ 
                                    "orders"
                                ],
                                "postRunDate" : []
                            },
                            "isUnique" : false,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 2,
                            "direction" : "forward",
                            "indexBounds" : {
                                "postType" : [ 
                                    "[\"AUTOMATIC\", \"AUTOMATIC\"]"
                                ],
                                "orders.UserId" : [ 
                                    "[MinKey, MaxKey]"
                                ],
                                "orders.flightStartDateForQuery" : [ 
                                    "[MinKey, MaxKey]"
                                ],
                                "orders.flightEndDateForQuery" : [ 
                                    "[MinKey, MaxKey]"
                                ],
                                "postRunDate" : [ 
                                    "[MaxKey, MinKey]"
                                ]
                            }
                        }
                    },
                    "rejectedPlans" : []
                }
            }
        }, 
        {
            "$project" : {
                "_id" : true,
                "headerPostedTotals" : true,
                "orders" : {
                    "UserId" : true
                }
            }
        }, 
        {
            "$unwind" : {
                "path" : "$orders"
            }
        }, 
        {
            "$group" : {
                "_id" : "$orders.UserId",
                "aes" : {
                    "$addToSet" : "$orders.UserId"
                }
            }
        }, 
        {
            "$sort" : {
                "sortKey" : {
                    "aes" : 1
                }
            }
        }
    ],
    "ok" : 1.0
}
...