В настоящее время мы сталкиваемся с ситуацией, когда мы не можем избежать сбора полного сканирования. Мы уже оптимизировали запрос и структуру данных, но мы хотим, чтобы мы пошли дальше и в полной мере использовали очертание и репликацию.Улучшить производительность запроса полного сканирования mongodb: репликация или очертание?
Конфигурация
- mongodb version 3.2
- monogo-java-driver 3.2
- storageEngine: wiredTiger
- compression level: snappy
- database size : 6GB
Структура Документы:
лиц сбор коллекция значения
{
"_id": 1,
"name": "randomName1",
"info": {...}
},
{
"_id": 2,
"name": "randomName2",
"info": {...}
},
[...]
{
"_id": 15000,
"name": "randomName15000",
"info": {...}
}
{
"_id": ObjectId("5804d7a41da35c2e06467911"),
"pos": NumberLong("2090845886852"),
"val":
[0, 0, 1, 0, 1, ... 0, 1]
},
{
"_id": ObjectId("5804d7a41da35c2e06467912"),
"pos": NumberLong("2090845886857"),
"val":
[1, 1, 1, 0, 1, ... 0, 0]
}
В массиве «val» содержится элемент для каждого отдельного пользователя (поэтому длина массива равна до 15000). Идентификатором индивида является соответствующий индекс в массиве «val».
Запрос
Запрос должен найти документы из коллекции значений, где сумма Валу [individual._id] является выше определенного Treshold для списка индивидуалки. Мы не можем просто предварительно вычислить сумму массива , так как список желающих изменить во время выполнения (мы можем получить результат для только для первых 2000 человек). Этот запрос использует структуру агрегации.
То, что мы сейчас делаем:
Мы разделили запрос в 100-500 подзапросов и запустить их 5 на 5 параллельно.
Первый подзапрос будет тем же запросом для документов, где позы> 0 и пос < 50000, второй для документов, где конт> 50000 и пос < 100000 ЭСТА ...
Мы хотели бы быть в состоянии для запуска большего количества подзапросов в одно и то же время, но мы столкнулись с потерей производительности при запуске более 5 на одном экземпляре mongod.
Так что вопрос: мы должны идти для репликации или сегментирование (или для обоих) в для запуска максимальное количество подзапросов в то же время? Как мы могли настроить mongodb для отправки подзапросов среди реплик/осколков как можно лучше?
изменить: предположим, что запрос уже полностью оптимизирован!
Спасибо за ответ! Возможно, я опубликую объяснение в другом вопросе, но на данный момент предположим, что запрос уже достаточно оптимизирован, что нам делать? – felix