Я хотел бы получить мнение от экспертов 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) за один раз?
Буду признателен за любую помощь или указатели, чтобы решить эту проблему.
Спасибо.
У вас есть какой-либо индекс на "appId"? Вам нужны все столбцы, которые будут показаны в Excel? Сколько времени требуется для сбора записей? –
Да, у меня есть указатель на appId. Я рассмотрел план запроса, и mongodb возвращает ответ на запрос довольно быстро в 1774 мс для> 900000 документов в коллекции. Я также использую фреймворк Spring-Data-MongoDB на стороне приложения для доступа к данным из MongoDB, и я думаю, что может возникнуть проблема с моим запросом: как Spring MongoTemplate получает доступ к данным. Я отлажу это больше на стороне приложения, добавив некоторые точки останова в поиске запросов Spring-Data-MongoDB, чтобы получить больше статистики. Я буду держать всех в курсе результатов. Спасибо – Navi
'db.test.User.find ({" appId ":" 20fabc6 "}). Sort ({" appId ": 1});' Когда у вас есть индекс возрастания на 'appId', сортировка () цепь не требуется. Удалите цепочку 'sort' и просто запустите' db.test.User.find ({"appId": "20fabc6"}) '. Храните данные в Осколках и сделайте 'appId' ключ осколка, а затем агрегируйте результаты на этапе' $ match' или выполните простой поиск. – BatScream