2014-01-02 1 views
2

Хотя MongoDB не требует какой-либо фиксированной схемы, есть моменты, когда мы хотели бы перейти из одной структуры в другую.MongoDB: миграция, обновление или вставка схемы

Недавно я имел дело с небольшим набором данных (~ 200K) и решил скомпилировать существующие данные, преобразовать модель данных и вставить в новые коллекции. Оказалось, что наши vps не были такими мощными, используя php-драйвер, я могу получить примерно до ~ 300 вставки/сек после обеспечения следующих условий:

  • индекс не указана перед вставкой.
  • использование пакет вставка по возможности.

Интересно, если я просто выбрал неправильный путь миграции, или если есть некоторые лучшие практики при работе с изменениемсхемы в MongoDB?


После взятия в некоторых предложений, я изменил беспокойство записи в 0 во время миграции, и это то, что я наблюдал:

  • Вставки все еще не так быстро, как ожидалось, не более при температуре ~ 500 inserting/sec
  • После того, как вставка завершена, индексирование проходит очень быстро, возможно, из-за того, что ensureIndex является огнем-забыть с w=0?
  • Оставшееся обновление потребовалось некоторое время, возможно, из-за того, что операции индексирования блокируются? Затем он работает с разной скоростью (ранее он работал последовательно медленнее), опять же, возможно, индексирование происходило.
  • CPU и IO были в порядке. В большинстве случаев процессор имел около 90% свободного времени, а ожидания ввода-вывода составляли менее 10%.

Помимо использования нашей PHP ORM для миграции, есть ли больше возможностей для оптимизации?

+0

Можете ли вы просто изменить свою схему с помощью .update() из самой оболочки? Выгрузить содержимое коллекции в другую коллекцию, а затем выполнить запрос на обновление? – user602525

+0

Что вы используете для WriteConcern? В подобном сценарии миграции вы сможете уйти с «Unrecnowledged», который должен дать вам довольно хорошее повышение производительности, если вы в настоящее время используете что-то более безопасное, как «Replica Acknowledged». – skelly

+0

Слишком сложно сделать хотя бы небольшой тест с другим водителем? Я не очень хорошо знаком с php-драйвером, но я сделал что-то подобное с помощью Python на Mac-компьютере (это действительно очень хорошо), и я смог обновить/вставить 10.000 за 5 секунд, и у меня не было для оптимизации моих сценариев. 2000 секунда, кажется, очень хорошая производительность для скрипта, который был написан через пару часов. –

ответ

1

Передача и сериализация всего и от клиента php, вероятно, добавляет много накладных расходов. Запуск миграции из оболочки будет самым быстрым. Напишите их с помощью update или используйте курсор с forEach для повторения и звонков save.

См. Пример использования курсоров MongoDB update multiple records of array (в нижней части).

Знайте о snapshot проблемах с курсорами. Возможно, хотите обновить idempotent или использовать моментальный снимок, если коллекция не оштрафована.

Смежные вопросы