У меня есть коллекция MondoDB с более чем 5 миллионами предметов.Каждый элемент имеет поля «начало» и «конец», содержащие целочисленные значения.
Элементы не имеют перекрывающихся начала и конца.
например, это будет недействительно :
{start:100, end:200}
{start:150, end:250}
Я пытаюсь найти элемент, в котором заданное значение находится между началом и концом
start <= VALUE <= end
Следующий запрос работает, но для возврата * 1013 требуется 5-15 секунд*
db.blocks.find({ "start" : { $lt : 3232235521 }, "end" :{ $gt : 3232235521 }}).limit(1);
Я добавил следующие индексы для тестирования с очень небольшим улучшением
db.blocks.ensureIndex({start:1});
db.blocks.ensureIndex({end:1});
//also a compounded one
db.blocks.ensureIndex({start:1,end:1});
** Правка **
Результат объяснения () в результатах запросав:
> db.blocks.find({ "start" : { $lt : 3232235521 }, "end" :{ $gt : 3232235521 }}).limit(1).explain();
{
"cursor" : "BtreeCursor end_1",
"nscanned" : 1160982,
"nscannedObjects" : 1160982,
"n" : 0,
"millis" : 5779,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"end" : [
[
3232235521,
1.7976931348623157e+308
]
]
}
}
Как лучше всего ускорить этот конкретный запрос?