Също така добавете малко повече към baloo отговорът на.
Относно проблема с времевия печат срещу дългия. Обикновено MongoDB сървърът няма да види разлика. Дължината на BSON кодиране е същата (64 бита). Може да видите различна производителност от страна на клиента в зависимост от кодирането на драйвера. Като пример, от страна на Java, използвайки драйвера 10gen, времевият печат се изобразява като Date
което е много по-тежко от Long
. Има драйвери
които се опитват да избегнат тези допълнителни разходи.
Другият проблем е, че ще видите подобрение на производителността, ако затворите диапазона за първото поле на индекса. Така че, ако използвате индекса, предложен от baloo :
db.collection.ensureIndex({start: 1, final: 1})
Вашата заявка ще се представи (потенциално много) по-добре, ако заявката е:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)},
final:{$lt:DateTime(...)}})
Концептуално, ако мислите за индексите като за дърво, затвореният диапазон ограничава двете страни на дървото вместо само едната страна. Без затворения диапазон сървърът трябва да "проверява" всички записи с start
по-голям от предоставения времеви печат, тъй като не знае за връзката между start
и final
.
Може дори да откриете, че производителността на заявката не е по-добра, като използвате индекс на едно поле като:
db.collection.ensureIndex({start: 1})
Повечето спестявания са от резитбата на първото поле. Случаят, в който това няма да е така, е когато заявката е покрита от индекса или подреждането/сортирането на резултатите може да бъде извлечено от индекса.
HTH - Роб.