Індукція мангуста у виробничому коді


124

Згідно з документацією " Мангуста" для MongooseJSта MongoDB/ Node.js:

Коли ваша програма запускається, Mongoose автоматично викликає ensureIndexкожен визначений індекс вашої схеми. Хоча це приємно для розвитку, рекомендується цю поведінку відключити у виробництві, оскільки створення індексу може спричинити значний вплив на продуктивність. Вимкніть поведінку, встановивши autoIndexпараметр вашої схеми на значення false.

Це, мабуть, дає змогу видалити автоматичну індексацію від мангуста перед розгортанням, щоб оптимізувати Mongoose від того, щоб доручити Mongo переходити та виконувати всі індекси при запуску програми, що, здається, має сенс.

Який правильний спосіб обробляти індексацію у виробничому коді? Можливо, зовнішній скрипт повинен генерувати індекси? Чи, можливо ensureIndex, непотрібно, якщо одна колекція є єдиним читачем / автором колекції, оскільки вона буде продовжуватись індексу кожного разу, коли трапляється запис БД?

Редагувати: Щоб доповнити, MongoDB пропонує хорошу документацію щодо того, як робити індексацію, але не чому, або коли слід робити чіткі директиви щодо індексації. Мені здається, що індекси повинні автоматично оновлюватися програмами авторів у колекціях із існуючими індексами, і ensureIndexце справді більше разової речі (робиться під час застосування нового індексу), і в цьому випадку Mongoose autoIndexмає бути відсутність опції при звичайному перезапуску сервера.

Відповіді:


135

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

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


10
У мене є запитання, яке потрібно додати ... Що робити, якщо я встановив його помилково? Чим будуть створені індекси, коли я вставляю дані або мені потрібно явно їх створювати. Мені шкода, якщо це питання початківця, але було б дуже корисно, якби ти відповів.
Саранш Мохапатра

5
@SaranshMohapatra Коли autoIndexце неправда, вам потрібно зателефонувати secureIndexes на вашу модель, щоб створити її індекси.
JohnnyHK

Чим мені доведеться називати це кожен раз або лише один раз визначати модель?
Саранш Мохапатра

@SaranshMohapatra, коли ви визначаєте (компілюєте) свою модель. Я роблю це, коли вперше запускаю додаток. Тепер важко подумати, щоб вирішити скинути всі індекси та відтворити їх у випадку, якщо схема зміниться.
Мосс

3
@JohnnyHK Ви все ще згодні з вашою відповіддю тепер, коли це майже 2016 рік?
Олександр Міллс

41

Хоча я згоден з прийнятою відповіддю, варто зазначити, що згідно з посібником MongoDB , це не рекомендований спосіб додавання індексів на виробничий сервер:

Якщо ваша програма включає операції secureIndex (), а індекс не існує для інших операційних проблем, створення індексу може мати серйозний вплив на продуктивність бази даних.

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

Звичайно, це дійсно залежить від того, як ваша програма структурована та розгорнута. Якщо ви, наприклад, розгортаєте програму Heroku і не використовуєте функцію передзавантаження Heroku , то, ймовірно, ваша програма взагалі не подає запити під час запуску, і тому, ймовірно, безпечно створити індекс на той час.

Крім цього, із прийнятої відповіді:

Тож це впливає на продуктивність лише тоді, коли ви вперше створюєте індекс, і тоді колекції часто порожні, тому створення індексу все-таки буде швидким.

Якщо вам вдалося змусити вашу модель даних та запити прибитими вперше, це добре, і це часто трапляється. Однак якщо ви додаєте нову функціональність у свою програму, з новим запитом БД у ресурсі без індексу, ви часто виявляєте, що додаєте індекс до колекції, що містить багато існуючих документів.

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

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

3
Гаразд, тому все, що вам потрібно зробити, це НЕ запускати ваш сервер, доки не повернуться всі зворотні виклики sureIndex для кожної колекції.
Олександр Міллс

@AlexMills як ви це забезпечите?
самотньо

async.each (Object.keys (моделі), функція (клавіша, cb) {моделі [ключ] .ensureIndexes (cb)}, cb)
Олександр Міллз

просто зателефонуйте secureIndexes на кожну модель мангусти, зачекайте, коли всі закінчаться, а потім запустіть сервер; Я також рекомендую зачекати, коли також відбудеться з'єднання db, перш ніж запустити ваш сервер
Олександр Міллз

2
Більше немає ensureIndex. createIndexНатомість є . Маю рацію?
джек-пусто

1

використовувати цей блок-код для обробки режиму виробництва:

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.