Настройка производительности запроса MongoDB (фильтр диапазона + сортировка) - PullRequest
1 голос
/ 21 марта 2019

У меня есть коллекция Mongo, содержащая миллионы документов в следующем формате:

{
    "_id" : ObjectId("5ac37fa989e00723fc4c7746"),
    "group-number" : NumberLong(128125089),
    "date" : ISODate("2018-04-03T13:20:41.193Z")
}

И я хочу получить документы между 2 датами (' date '), отсортированными по ' группа-Numbe г».Итак, я выполняю запросы такого типа:

db.getCollection('group').find({date:{$gt:new Date(1491372960000),$lt:new Date(1553152560000)}}).sort({"group-number":1})

В соответствии с https://blog.mlab.com/2012/06/cardinal-ins/ кажется, что MongoDB при запросах не по эквивалентным значениям, но с range значений (как в моем случае), лучше иметь индекс в обратном порядке (сначала отсортированное поле / затем отфильтрованное поле).Действительно, у меня были лучшие результаты с индексом db.group.createIndex({"group-number":1,"date":1});.Но все же это занимает слишком много времени;в тех же случаях более 40 секунд.

Согласно результатам объяснение () , действительно используется вышеуказанный индекс.

"winningPlan" : {
            "stage" : "FETCH",
            "filter" : {
                "$and" : [ 
                    {
                        "date" : {
                            "$lt" : ISODate("2019-03-21T07:16:00.000Z")
                        }
                    }, 
                    {
                        "date" : {
                            "$gt" : ISODate("2017-04-05T06:16:00.000Z")
                        }
                    }
                ]
            },
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "group-number" : 1.0,
                    "date" : 1.0
                },
                "indexName" : "group-number_1_date_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "group-number" : [],
                    "date" : []
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "group-number" : [ 
                        "[MinKey, MaxKey]"
                    ],
                    "date" : [ 
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        }

Как улучшитьспектакль?Должно быть, я что-то упустил ...

1 Ответ

0 голосов
/ 21 марта 2019

Я бы построил индекс в обратном порядке: db.createIndex({date: 1, 'group-number': 1}).Просто потому, что вы на самом деле делаете запрос через поле date, поэтому оно должно стоять на первом месте в составном индексе.Вы используете group-number только для сортировки.Таким образом, WiredTiger облегчает поиск необходимых документов в BTree.

...