2016-10-24 7 views
0

В настоящее время мы сталкиваемся с ситуацией, когда мы не можем избежать сбора полного сканирования. Мы уже оптимизировали запрос и структуру данных, но мы хотим, чтобы мы пошли дальше и в полной мере использовали очертание и репликацию.Улучшить производительность запроса полного сканирования 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 для отправки подзапросов среди реплик/осколков как можно лучше?

изменить: предположим, что запрос уже полностью оптимизирован!

ответ

1

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

Sharding Может быть быть вариантом, но я думаю, что следующим шагом для вас было бы опубликовать объяснение для запроса и посмотреть, сможет ли кто-нибудь сделать предложения по повышению производительности. Возможно, есть какая-то настройка, которую вы могли бы сделать, что вы пропустили, или, возможно, вы увидите прирост производительности за счет обновления текущего RAM или CPU сервера MongoDB.

Короче говоря, я бы предложил опубликовать объяснение, прежде чем приступать ко всем усилиям по шиллингу.

+0

Спасибо за ответ! Возможно, я опубликую объяснение в другом вопросе, но на данный момент предположим, что запрос уже достаточно оптимизирован, что нам делать? – felix