Mongodb Sorting Desc для поля _id очень медленно - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть база данных mongodb, в которой есть 30 миллионов словаря, и каждый день месяца имеет 1 миллион строк, поэтому все документы насчитывают 30x1 = 30 миллионов, база данных просто содержит данные за 1 месяц, и я хочу перечислять и сортировать записи desc между2018-07-01 и 2018-07-03, поэтому у меня есть 2 миллиона строк между этими двумя днями. Каждая моя коллекция, как показано ниже:

{
"_id":"5c66cf5b67011aa76ca597b6",
"timestamp":"2018-07-01 15:45:37.000",
"category":"category_1"
}

Я добавил сортировочный индекс desc для столбца меток времени

Когда я пытаюсь сортировать asc, я получаю ответ 0,1 секунды, но я пытаюсь сортировать desc, я получаю ответ 702 секунды

Я строю python

from pymongo import MongoClient
import datetime
import time
client = MongoClient()
client = MongoClient('localhost', 27017)
db = client.MongoBencmarkTestDB

indicator_collections = db.IndicatorCollections

dstart = datetime.datetime(2018, 7, 1,0, 0, 0)
dfinish = datetime.datetime(2018, 7, 3,0, 0, 0)

for indicator_collection in indicator_collections.find({
    "$and":
        [
            {
                "timestamp": {"$lte": dfinish, "$gte": dstart}
            },
        ]

}).sort([("_id", -1)]).skip(0).limit(1000):
    print(indicator_collection['_id'])

Когда я объясняю поле _id для сортировкиdesc:

db.IndicatorCollections.find().sort({_id : -1}).explain()

Получение ответа:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "MongoBencmarkTestDB.IndicatorCollections",
        "indexFilterSet" : false,
        "parsedQuery" : {

        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "_id" : 1
                },
                "indexName" : "_id_",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "_id" : [ ]
                },
                "isUnique" : true,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "backward",
                "indexBounds" : {
                    "_id" : [
                        "[MaxKey, MinKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "reterius-pc-MacBook-Pro.local",
        "port" : 27017,
        "version" : "4.0.3",
        "gitVersion" : "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"
    },
    "ok" : 1
}

Мои индексы:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "MongoBencmarkTestDB.IndicatorCollections"
    },
    {
        "v" : 2,
        "key" : {
            "timestamp" : -1
        },
        "name" : "timestamp_-1",
        "ns" : "MongoBencmarkTestDB.IndicatorCollections"
    }
]

Я хочу получить ответ быстро, потому что он очень важен.

1 Ответ

0 голосов
/ 19 февраля 2019

Итак, вам нужно запустить db.collection.createIndex ({timestamp: 1, _id: -1}) и снова проверить, не быстрее ли он (как и должно быть).Как я уже писал ранее, Mongo использует только один индекс для запроса, и если нет индекса с отметкой времени и нисходящим полем _id, он работает медленно.

...