Как оптимизировать запрос MongoDB с помощью $ gt и $ lte?

У меня есть следующий запрос, который вроде как поиск в обратном диапазоне:

db.ip_ranges.find({ $and: [{ start_ip_num: { $lte: 1204135028 } }, { end_ip_num: { $gt: 1204135028 } }] })

При запуске только с идентификатором $ lte запрос возвращается сразу. Но когда я выполняю и $ gt, и $ lte в одном запросе, это происходит очень медленно (в секундах).

Поля start_ip_num и end_ip_num индексируются.

Как я могу оптимизировать этот запрос?

РЕДАКТИРОВАТЬ

Я получаю следующее, когда использую функцию объяснения () в запросе:

{
    "cursor" : "BtreeCursor start_ip_num_1",
    "nscanned" : 452336,
    "nscannedObjects" : 452336,
    "n" : 1,
    "millis" : 2218,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "start_ip_num" : [
            [
                -1.7976931348623157e+308,
                1204135028
            ]
        ]
    }
}

РЕДАКТИРОВАТЬ 2

После добавления составного индекса функция объяснения () возвращает следующее:

{
    "cursor" : "BtreeCursor start_ip_num_1_end_ip_num_1",
    "nscanned" : 431776,
    "nscannedObjects" : 1,
    "n" : 1,
    "millis" : 3433,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "start_ip_num" : [
            [
                -1.7976931348623157e+308,
                1204135028
            ]
        ],
        "end_ip_num" : [
            [
                1204135028,
                1.7976931348623157e+308
            ]
        ]
    }
}

Тем не менее, производительность по-прежнему оставляет желать лучшего (в секундах) .A

Ответы на вопрос(4)

Ваш ответ на вопрос