2

Я хотел бы получить мнение от экспертов MongoDB как о том, какие параметры оптимизации/функции запросов mongodb можно применить для ускорения чтения запроса для такой большой коллекции документов (наборов данных) быть доступным за один раз (найти запрос).Оптимизация запросов MongoDB для больших документов - набор данных - запрос застрял

Может быть, кто-то из сообщества монгодбов столкнулся с подобной проблемой, и у них есть некоторые мысли, чтобы решить то же самое.

Я использую MongoDB2.6

Требование, чтобы извлечь все записи в одном запросе, поскольку эти документы заполняются в листе первенствовать для пользователей, чтобы загрузить данные в Excel.

У меня есть большая коллекция пользователей около 2000000 документов в коллекции пользователей.

Коллекция пользователя поле:

{ 
_id: ObjectId("54866f133345a61b6b9a701"), 
appId: "20fabc6", 
firstName: "FN", 
lastName: "LN", 
email: "[email protected]", 
userType: "I", 
active: "true", 
lastUpdatedBy: "TN", 
lastUpdatedDate: ISODate("2013-01-24T05:00:00Z"), 
createdTime: ISODate("2011-01-24T05:00:00Z"), 

}

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

Ниже находка запрос:

db.test.User.find({"appId": "20fabc6"}).sort({"appId" : 1}); 

Запроса Функция:

List<Users> findByAppId(Object[] appIds) { 
Query query = new Query(); 
query.addCriteria(Criteria.where("appId").in(appIds)); 
return mongoTemplate.find(query, Users.class); 
} 

Я поставил индекс на выше APPID поля, по-прежнему запрос занимает слишком много времени.

Я побежал счетчик на запросе, и я могу видеть, 900000 записей для указанных выше находок запроса, совпадающего с APPID

db.test.User.find({"appId": "20fabc6"}).count(); 
900000 

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

1) Добавление большего количества полей для фильтрации журнала инструктажа, который до сих пор большое количество

db.test.User.find({"appId": "20fabc6"}, "active": "true").count(); 
700000 

2) ограничивает No.of запись, используя предельную MongoDB операции для г ange queries - что повлияет на наше первое требование по загрузке всех пользовательских данных за один проход в лист excel.

Помогает ли агрегирование с помощью курсора или кладет в кластер, если нам нужно выполнить вышеуказанный запрос поиска и извлечь столько документов (900000) за один раз?

Буду признателен за любую помощь или указатели, чтобы решить эту проблему.

Спасибо.

+0

У вас есть какой-либо индекс на "appId"? Вам нужны все столбцы, которые будут показаны в Excel? Сколько времени требуется для сбора записей? –

+0

Да, у меня есть указатель на appId. Я рассмотрел план запроса, и mongodb возвращает ответ на запрос довольно быстро в 1774 мс для> 900000 документов в коллекции. Я также использую фреймворк Spring-Data-MongoDB на стороне приложения для доступа к данным из MongoDB, и я думаю, что может возникнуть проблема с моим запросом: как Spring MongoTemplate получает доступ к данным. Я отлажу это больше на стороне приложения, добавив некоторые точки останова в поиске запросов Spring-Data-MongoDB, чтобы получить больше статистики. Я буду держать всех в курсе результатов. Спасибо – Navi

+0

'db.test.User.find ({" appId ":" 20fabc6 "}). Sort ({" appId ": 1});' Когда у вас есть индекс возрастания на 'appId', сортировка () цепь не требуется. Удалите цепочку 'sort' и просто запустите' db.test.User.find ({"appId": "20fabc6"}) '. Храните данные в Осколках и сделайте 'appId' ключ осколка, а затем агрегируйте результаты на этапе' $ match' или выполните простой поиск. – BatScream

ответ

0

Ваш вид() не нужен, поскольку вы пытаетесь найти только документы с appId из 20fabc6, так почему бы вам тогда отсортировать этот же appId, так как он будет таким же для всех возвращенных записей?

Создание индекса на APPID поля

db.test.User.ensureIndex({"appId":1}) 

И ваш запрос должен сканировать только 900000 документов. Вы можете дважды проверить это с помощью метаданных производительности с помощью метода .explain() в вашей находке.

db.test.User.find({"appId": "20fabc6"}).explain()