Индексация мангустов в производственном коде
в Мангуста документация на MongooseJS и MongoDB/Node.js:
когда ваше приложение запускается, Мангуст автоматически вызывает
ensureIndexдля каждого определенного индекса в вашей схеме. Хотя это хорошо для разработки, рекомендуется отключить это поведение в производстве, так как создание индекса может вызвать значительное влияние на производительность. Отключите поведение, установивautoIndexопция вашей схемы в false.
этот кажется, чтобы проинструктировать удаление автоиндексации из Мангуста перед развертыванием для оптимизации Мангуста от инструкции Монго идти и сбивать все индексы при запуске приложения, что, по-видимому, имеет смысл.
как правильно обрабатывать индексацию в производственном коде? Может быть, внешний скрипт должен генерировать индексы? Или, может быть,ensureIndex не требуется, если одно приложение является единственным средством чтения / записи в коллекцию, потому что оно будет продолжать индекс каждый раз, когда запись БД происходит?
Edit: в дополнение, MongoDB обеспечивает хорошее документация на как делать индексацию, но не почему или , когда явные директивы индексирования должны быть выполнены. Мне кажется, что индексы должны обновляться приложениями writer автоматически в коллекциях с существующими индексами и что ensureIndex это действительно больше одноразовая вещь (делается, когда применяется новый индекс), в которой дело Мангуста autoIndex должен быть no-op при обычном перезапуске сервера.
2 ответов:
Я никогда не понимал, почему документация Мангуста так широко рекомендует отключить
autoIndexв производстве. После того, как индекс был добавлен, последующиеensureIndexвызовы просто увидят, что индекс уже существует, а затем вернутся. Поэтому он влияет на производительность только при первом создании индекса, и в это время коллекции часто пусты, поэтому создание индекса будет быстрым в любом случае.мое предложение-оставить
autoIndexвключено, если у вас есть конкретный ситуация, когда это дает вам проблемы; например, если вы хотите добавить новый индекс в существующую коллекцию, которая имеет миллионы документов, и вы хотите больше контролировать, когда она создается.
хотя я согласен с принятым ответом, стоит отметить, что согласно руководство MongoDB, это не рекомендуемый способ добавления индексов на рабочем сервере:
Если ваше приложение включает операции ensureIndex (), а индекс не существует для других операционных задач, построение индекса может оказать серьезное влияние на производительность базы данных.
чтобы избежать проблем с производительностью, убедитесь, что ваш приложение проверяет наличие индексов при запуске с помощью метода getIndexes() или эквивалентного метода для вашего драйвера и завершает работу, если соответствующие индексы не существуют. Всегда создавайте индексы в производственных экземплярах, используя отдельный код приложения, во время назначенных окон обслуживания.
конечно, это действительно зависит от того, как приложение структурировано и развернуто. При развертывании на Heroku, например, и вы не используете в Heroku предзагрузочной особенность, то, скорее всего, ваше приложение не обслуживает запросы вообще во время запуска, и поэтому, вероятно, безопасно создать индекс в это время.
В дополнение к этому, из принятого ответа:
таким образом, это влияет только на производительность, когда вы впервые создаете индекс, и в то время коллекции часто пусты, поэтому создание индекса будет быстрым в любом случае.
Если вам удалось получить модель данных и запросы прибиты на первый раз вокруг, это нормально, и часто бывает. Однако при добавлении новых функций в приложение с новым запросом БД к свойству без индекса вы часто обнаруживаете, что добавляете индекс в коллекцию, содержащую множество существующих документов.
это время, когда вам нужно быть осторожным при добавлении индексов и тщательно рассмотреть последствия для производительности этого. Например, вы могли бы создать индекс в фон:
db.ensureIndex({ name: 1 }, { background: true });
Comments