Ответ 1
Прежде всего, вы должны потратить немного времени на то, как MongoDB хранит документы со ссылкой на коэффициенты заполнения и распределение powerof2sizes:
http://docs.mongodb.org/manual/core/storage/ http://docs.mongodb.org/manual/reference/command/collStats/#collStats.paddingFactor
Проще говоря, MongoDB пытается выделить некоторое дополнительное пространство при сохранении исходного документа, чтобы обеспечить его рост. Распределение Powerof2sizes стало стандартным подходом в версии 2.6, где он увеличит размер документа с полномочиями 2.
В целом производительность будет намного лучше, если все обновления будут соответствовать исходному размеру. Причина в том, что если они этого не делают, весь документ нужно перемещать где-то еще с достаточным пространством, вызывая больше чтений и записей и фактически фрагментируя ваше хранилище.
Если ваши документы действительно будут расти в размере от 10X до 20X сверхурочно, это может означать несколько ходов на документ, которые в зависимости от вашей вставки, частоты обновления и чтения могут вызвать проблемы. Если это так, вы можете рассмотреть несколько подходов:
1) Выделите достаточное пространство при первоначальной вставке, чтобы покрыть большинство (допустим, 90%) обычного срока службы документов. Хотя это будет неэффективно в использовании пространства в начале, эффективность будет возрастать со временем по мере роста документов без снижения производительности. Фактически, вы будете платить за это время за хранение, которое в конечном итоге вы будете использовать позже, чтобы получить хорошую производительность с течением времени.
2) Создайте документы "переполнения" - скажем, типичное правило 80-20, и 80% ваших документов будут соответствовать определенному размеру. Выделите эту сумму и добавьте коллекцию переполнения, которую может указать ваш документ, если у них более 100 друзей или 100 игровых документов, например. Поле переполнения указывает на документ в этой новой коллекции, и ваше приложение просматривает только новую коллекцию, если существует поле переполнения. Позволяет выполнять обычную обработку документов для 80% пользователей и позволяет избежать большого количества хранения на 80% пользовательских документов, которые ему не понадобятся, за счет дополнительной сложности приложений.
В любом случае я бы рассмотрел использование закрытых запросов, построив соответствующие индексы:
Закрытый запрос - это запрос, в котором:
all the fields in the query are part of an index, and all the fields returned in the results are in the same index.
Поскольку индекс "охватывает" запрос, MongoDB может соответствовать запросу условий и возвращать результаты, используя только индекс; MongoDB делает не нужно смотреть на документы, только индекс, чтобы выполнить запрос.
Запрос только по индексу может быть намного быстрее, чем запрос документов вне индекса. Индексные ключи обычно меньше, чем документы, которые они каталогизируют, и индексы обычно доступны в ОЗУ или расположенных последовательно на диске.
Подробнее об этом здесь: http://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/