0

Играя с MongoChef, я обнаружил, что запросы становятся медленнее со временем и количеством документов в коллекции. EX: Я начал приложение в ноябре прошлого года, и с этого времени я сохраняю данные в базу данных mongo в той же коллекции без истечения срока действия.Mongo Query Performance

Теперь я выполнить этот запрос:

{ "mongoTime": { $gte: "2015-09-01T15:46:51+0200" }, $and: [ { "mongoTime": { $lt: "2015-11-01T15:46:51+0200" } } ] } 

Это получение 239 691 документов в 0,178 сек в течение 2-х месяцев периода времени.

Но:

{ "mongoTime": { $gte: "2016-01-27T00:00:00+0000" }, $and: [ { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } ] } 

ли получение 199 909 документов в 6.391 сек в течение 3-х дней период времени.

Различия: первый запрос получает все документы, которые были первыми вставлены в Mongo, второй получает весь документ за последние 3 дня до сих пор.

Конечно, в коллекции уже есть несколько миллионов документов, я бы хотел прочитать некоторые советы о том, как справиться с этой проблемой. Я думал об индексах использования: somethig как:

db.clicks.createIndex({ "mongoTime": 1 }) 

ИЛИ

db.clicks.createIndex({ "mongoTime": -1 }) 

но обновлять индексы для этой коллекции собирается занять некоторое время, и это лучше спросить, прежде чем делать ошибки, и индексы могут afect пишите также.

благодарит заранее.

После прочтения правильного ответа и индекса применяет указанный:

{ "mongoTime": { $gte: "2016-01-27T00:00:00+0000" }, $and: [ { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } ] } 

ли получение 199 909 документов в 0,194 сек в течение 3-х дней периода времени.

Большое улучшение. Спасибо ...

ответ

2
db.clicks.createIndex({ "mongoTime": 1 }) 

Да, этот показатель значительно увеличит производительность запросов, которые вы предоставили. MongoDB сможет более эффективно проверять условия фильтрации ваших запросов, вместо того чтобы проходить через каждый документ в коллекции, он будет проходить через индекс B-tree, тем самым значительно уменьшив количество узлов, которые он должен посетить.

Кстати, вы не используете $and правильно. Вот правильный способ:

{ $and: [ 
    { "mongoTime": { $gte: "2016-01-27T00:00:00+0000" } }, 
    { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } 
] } 
+1

Или еще лучше, избавиться от '$ and' и сделать его:' {mongoTime: {$ GTE: "2016-01-27T00: 00: 00 + 0000", $ lt: "2016-01-29T11: 38: 42 + 0000"}} '. – JohnnyHK

+0

Хорошо, спасибо за ответ. –