Хотя MongoDB не требует какой-либо фиксированной схемы, есть моменты, когда мы хотели бы перейти из одной структуры в другую.
Недавно я имел дело с небольшим набором данных (~ 200 КБ) и решил скомпилировать существующие данные, преобразовать модель данных и вставить в новые коллекции. Оказалось, что наши vps не были такими мощными, используя php-драйвер, я могу получить примерно до ~ 300 вставки / сек, после того как вы обеспечили следующее:
Интересно, просто ли я выбрал неправильный путь миграции или если есть какая-то передовая практика при изменении схемы в MongoDB?
После внесения некоторых предложений, я изменил отношение записи к 0 во время миграции, и это то, что я заметил:
ensureIndex
является fire-and-forget с w=0
? Кроме того, чтобы не использовать наш PHP ORM для миграции, есть ли больше возможностей для оптимизации?
Передача и сериализация всего в php-клиент и из него, вероятно, добавляет много накладных расходов. Запуск миграции из оболочки будет самым быстрым. Напишите их с обновлением или используйте курсор с функцией forEach для повторения и выполнения вызовов для сохранения .
См. Пример использования курсоров. MongoDB обновляет несколько записей массива (в нижней части).
Помните о моментальных снимках с помощью курсоров. Возможно, хотите обновить idempotent или использовать моментальный снимок, если коллекция не оштрафована.