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

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

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

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

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

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

2 ответов


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

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


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

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

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

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

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

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

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

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

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