Хотя MongoDB не требует какой-либо фиксированной схемы, есть моменты, когда мы хотели бы перейти из одной структуры в другую.MongoDB: миграция, обновление или вставка схемы
Недавно я имел дело с небольшим набором данных (~ 200K) и решил скомпилировать существующие данные, преобразовать модель данных и вставить в новые коллекции. Оказалось, что наши vps не были такими мощными, используя php-драйвер, я могу получить примерно до ~ 300 вставки/сек после обеспечения следующих условий:
- индекс не указана перед вставкой.
- использование пакет вставка по возможности.
Интересно, если я просто выбрал неправильный путь миграции, или если есть некоторые лучшие практики при работе с изменениемсхемы в MongoDB?
После взятия в некоторых предложений, я изменил беспокойство записи в 0 во время миграции, и это то, что я наблюдал:
- Вставки все еще не так быстро, как ожидалось, не более при температуре ~ 500 inserting/sec
- После того, как вставка завершена, индексирование проходит очень быстро, возможно, из-за того, что
ensureIndex
является огнем-забыть сw=0
? - Оставшееся обновление потребовалось некоторое время, возможно, из-за того, что операции индексирования блокируются? Затем он работает с разной скоростью (ранее он работал последовательно медленнее), опять же, возможно, индексирование происходило.
- CPU и IO были в порядке. В большинстве случаев процессор имел около 90% свободного времени, а ожидания ввода-вывода составляли менее 10%.
Помимо использования нашей PHP ORM для миграции, есть ли больше возможностей для оптимизации?
Можете ли вы просто изменить свою схему с помощью .update() из самой оболочки? Выгрузить содержимое коллекции в другую коллекцию, а затем выполнить запрос на обновление? – user602525
Что вы используете для WriteConcern? В подобном сценарии миграции вы сможете уйти с «Unrecnowledged», который должен дать вам довольно хорошее повышение производительности, если вы в настоящее время используете что-то более безопасное, как «Replica Acknowledged». – skelly
Слишком сложно сделать хотя бы небольшой тест с другим водителем? Я не очень хорошо знаком с php-драйвером, но я сделал что-то подобное с помощью Python на Mac-компьютере (это действительно очень хорошо), и я смог обновить/вставить 10.000 за 5 секунд, и у меня не было для оптимизации моих сценариев. 2000 секунда, кажется, очень хорошая производительность для скрипта, который был написан через пару часов. –