Тот же запрос mongodb дает другой план объяснения - PullRequest
0 голосов
/ 29 мая 2018

У меня два запроса на монго, единственное изменение в запросе - это поле merchantId, но оба запроса дают мне другой выигрышный план.

Первый запрос

db.transactions.find({"created":{"$gte":1527465600000,"$lte":1527551999000},"merchantId":940,"additionalInformation.REQUESTOR":{"$ne":"MOTO"},"$or":[{"paymentMode":{"$ne":"UPI"}},{"bankCode":{"$ne":"GTEZ"}}]}).sort({ _id: -1 }).limit(200).explain()

Вывод вышеуказанного запроса

{
    "queryPlanner" : {
            "plannerVersion" : 1,
            "indexFilterSet" : false,
            "parsedQuery" : {
                    "$and" : [
                            {
                                    "$or" : [
                                            {
                                                    "$not" : {
                                                            "bankCode" : {
                                                                    "$eq" : "GTEZ"
                                                            }
                                                    }
                                            },
                                            {
                                                    "$not" : {
                                                            "paymentMode" : {
                                                                    "$eq" : "UPI"
                                                            }
                                                    }
                                            }
                                    ]
                            },
                            {
                                    "merchantId" : {
                                            "$eq" : 940
                                    }
                            },
                            {
                                    "created" : {
                                            "$lte" : 1527551999000
                                    }
                            },
                            {
                                    "created" : {
                                            "$gte" : 1527465600000
                                    }
                            },
                            {
                                    "$not" : {
                                            "additionalInformation.REQUESTOR" : {
                                                    "$eq" : "MOTO"
                                            }
                                    }
                            }
                    ]
            },
            "winningPlan" : {
                    "stage" : "SORT",
                    "sortPattern" : {
                            "_id" : -1
                    },
                    "limitAmount" : 200,
                    "inputStage" : {
                            "stage" : "SORT_KEY_GENERATOR",
                            "inputStage" : {
                                    "stage" : "FETCH",
                                    "filter" : {
                                            "$and" : [
                                                    {
                                                            "$or" : [
                                                                    {
                                                                            "$not" : {
                                                                                    "bankCode" : {
                                                                                            "$eq" : "GTEZ"
                                                                                    }
                                                                            }
                                                                    },
                                                                    {
                                                                            "$not" : {
                                                                                    "paymentMode" : {
                                                                                            "$eq" : "UPI"
                                                                                    }
                                                                            }
                                                                    }
                                                            ]
                                                    },
                                                    {
                                                            "$not" : {
                                                                    "additionalInformation.REQUESTOR" : {
                                                                            "$eq" : "MOTO"
                                                                    }
                                                            }
                                                    }
                                            ]
                                    },
                                    "inputStage" : {
                                            "stage" : "IXSCAN",
                                            "keyPattern" : {
                                                    "created" : 1,
                                                    "merchantId" : 1
                                            },
                                            "indexName" : "created_1_merchantId_1",
                                            "isMultiKey" : false,
                                            "isUnique" : false,
                                            "isSparse" : false,
                                            "isPartial" : false,
                                            "indexVersion" : 1,
                                            "direction" : "forward",
                                            "indexBounds" : {
                                                    "created" : [
                                                            "[1527465600000.0, 1527551999000.0]"
                                                    ],
                                                    "merchantId" : [
                                                            "[940.0, 940.0]"
                                                    ]
                                            }
                                    }
                            }
                    }
            }

    },
    "serverInfo" : {

    },
    "ok" : 1

}

Второй запрос

db.transactions.find({"created":{"$gte":1527465600000,"$lte":1527551999000},"merchantId":1429,"additionalInformation.REQUESTOR":{"$ne":"MOTO"},"$or":[{"paymentMode":{"$ne":"UPI"}},{"bankCode":{"$ne":"GTEZ"}}]}).sort({ _id: -1 }).limit(200).explain()

Вывод вышеуказанного запроса

{
    "queryPlanner" : {
            "plannerVersion" : 1,
            "indexFilterSet" : false,
            "parsedQuery" : {
                    "$and" : [
                            {
                                    "$or" : [
                                            {
                                                    "$not" : {
                                                            "bankCode" : {
                                                                    "$eq" : "GTEZ"
                                                            }
                                                    }
                                            },
                                            {
                                                    "$not" : {
                                                            "paymentMode" : {
                                                                    "$eq" : "UPI"
                                                            }
                                                    }
                                            }
                                    ]
                            },
                            {
                                    "merchantId" : {
                                            "$eq" : 1429
                                    }
                            },
                            {
                                    "created" : {
                                            "$lte" : 1527551999000
                                    }
                            },
                            {
                                    "created" : {
                                            "$gte" : 1527465600000
                                    }
                            },
                            {
                                    "$not" : {
                                            "additionalInformation.REQUESTOR" : {
                                                    "$eq" : "MOTO"
                                            }
                                    }
                            }
                    ]
            },
            "winningPlan" : {
                    "stage" : "LIMIT",
                    "limitAmount" : 200,
                    "inputStage" : {
                            "stage" : "FETCH",
                            "filter" : {
                                    "$and" : [
                                            {
                                                    "$or" : [
                                                            {
                                                                    "$not" : {
                                                                            "bankCode" : {
                                                                                    "$eq" : "GTEZ"
                                                                            }
                                                                    }
                                                            },
                                                            {
                                                                    "$not" : {
                                                                            "paymentMode" : {
                                                                                    "$eq" : "UPI"
                                                                            }
                                                                    }
                                                            }
                                                    ]
                                            },
                                            {
                                                    "merchantId" : {
                                                            "$eq" : 1429
                                                    }
                                            },
                                            {
                                                    "created" : {
                                                            "$lte" : 1527551999000
                                                    }
                                            },
                                            {
                                                    "created" : {
                                                            "$gte" : 1527465600000
                                                    }
                                            },
                                            {
                                                    "$not" : {
                                                            "additionalInformation.REQUESTOR" : {
                                                                    "$eq" : "MOTO"
                                                            }
                                                    }
                                            }
                                    ]
                            },
                            "inputStage" : {
                                    "stage" : "IXSCAN",
                                    "keyPattern" : {
                                            "_id" : 1
                                    },
                                    "indexName" : "_id_",
                                    "isMultiKey" : false,
                                    "isUnique" : true,
                                    "isSparse" : false,
                                    "isPartial" : false,
                                    "indexVersion" : 1,
                                    "direction" : "backward",
                                    "indexBounds" : {
                                            "_id" : [
                                                    "[MaxKey, MinKey]"
                                            ]
                                    }
                            }
                    }
            }

    },
    "serverInfo" : {

    },
    "ok" : 1

}

Как видите, толькоРазница в параметрах - merchantId, но объяснение дает другой план выигрыша, также IXSCAN также показывает разные используемые индексыВ первом запросе используется create_1_merchantId_1 index, а во втором запросе используется id index.Первый запрос занимает 40 секунд, чтобы получить результаты, в то время как второй запрос дает 1 секунду.Быстрый будет высоко оценен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...