Как оптимизировать запрос 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