Индексация мангустов в производственном коде



в Мангуста документация на MongooseJS и MongoDB/Node.js:




когда ваше приложение запускается, Мангуст автоматически вызывает ensureIndex для каждого определенного индекса в вашей схеме. Хотя это хорошо для разработки, рекомендуется отключить это поведение в производстве, так как создание индекса может вызвать значительное влияние на производительность. Отключите поведение, установив autoIndex опция вашей схемы в false.




этот кажется, чтобы проинструктировать удаление автоиндексации из Мангуста перед развертыванием для оптимизации Мангуста от инструкции Монго идти и сбивать все индексы при запуске приложения, что, по-видимому, имеет смысл.



как правильно обрабатывать индексацию в производственном коде? Может быть, внешний скрипт должен генерировать индексы? Или, может быть,ensureIndex не требуется, если одно приложение является единственным средством чтения / записи в коллекцию, потому что оно будет продолжать индекс каждый раз, когда запись БД происходит?



Edit: в дополнение, MongoDB обеспечивает хорошее документация на как делать индексацию, но не почему или , когда явные директивы индексирования должны быть выполнены. Мне кажется, что индексы должны обновляться приложениями writer автоматически в коллекциях с существующими индексами и что ensureIndex это действительно больше одноразовая вещь (делается, когда применяется новый индекс), в которой дело Мангуста autoIndex должен быть no-op при обычном перезапуске сервера.

609   2  

2 ответов:

Я никогда не понимал, почему документация Мангуста так широко рекомендует отключить autoIndex в производстве. После того, как индекс был добавлен, последующие ensureIndex вызовы просто увидят, что индекс уже существует, а затем вернутся. Поэтому он влияет на производительность только при первом создании индекса, и в это время коллекции часто пусты, поэтому создание индекса будет быстрым в любом случае.

мое предложение-оставить autoIndex включено, если у вас есть конкретный ситуация, когда это дает вам проблемы; например, если вы хотите добавить новый индекс в существующую коллекцию, которая имеет миллионы документов, и вы хотите больше контролировать, когда она создается.

хотя я согласен с принятым ответом, стоит отметить, что согласно руководство MongoDB, это не рекомендуемый способ добавления индексов на рабочем сервере:

Если ваше приложение включает операции ensureIndex (), а индекс не существует для других операционных задач, построение индекса может оказать серьезное влияние на производительность базы данных.

чтобы избежать проблем с производительностью, убедитесь, что ваш приложение проверяет наличие индексов при запуске с помощью метода getIndexes() или эквивалентного метода для вашего драйвера и завершает работу, если соответствующие индексы не существуют. Всегда создавайте индексы в производственных экземплярах, используя отдельный код приложения, во время назначенных окон обслуживания.

конечно, это действительно зависит от того, как приложение структурировано и развернуто. При развертывании на Heroku, например, и вы не используете в Heroku предзагрузочной особенность, то, скорее всего, ваше приложение не обслуживает запросы вообще во время запуска, и поэтому, вероятно, безопасно создать индекс в это время.

В дополнение к этому, из принятого ответа:

таким образом, это влияет только на производительность, когда вы впервые создаете индекс, и в то время коллекции часто пусты, поэтому создание индекса будет быстрым в любом случае.

Если вам удалось получить модель данных и запросы прибиты на первый раз вокруг, это нормально, и часто бывает. Однако при добавлении новых функций в приложение с новым запросом БД к свойству без индекса вы часто обнаруживаете, что добавляете индекс в коллекцию, содержащую множество существующих документов.

это время, когда вам нужно быть осторожным при добавлении индексов и тщательно рассмотреть последствия для производительности этого. Например, вы могли бы создать индекс в фон:

db.ensureIndex({ name: 1 }, { background: true });

Comments

    Ничего не найдено.