У меня есть ряд индексов в моей MongoDB, и я думаю , что одна из причин, по которой я работаю в системе с таким высоким ЦП, заключается в том, что обновление индексов блокирует. (Микроэкземпляр AWS работает с 50% + ЦП при нормальной работе, 99,9% при тяжелых операциях записи).
У меня есть достаточно горстки индексов для быстрых запросов, и теперь я думаю, что смогу показать некоторые дальнейшие улучшения, переместив построение индекса в фоновую операцию.
Я не хочу полностью удалить индексы (по крайней мере, я так не думаю), вместо этого я был бы рад, если бы "фоновые операции" выполнялись в фоновом режиме.
Я посмотрел документацию по созданию индекса mongo http://www.mongodb.org/display/DOCS/Indexes и вижу флаги включения фоновой операции (см. Ниже), но ничего не вижу о том, как изменить существующий индекс.
db.things.ensureIndex({x:1}, {background:true});
> db.things.ensureIndex({name:1}, {background:true, unique:true,
... dropDups:true});
Я попытался выполнить исходную команду индекса во второй раз с обновленным параметром, но когда я повторно выполняю db.colection.getIndexes();
comant, он не показывает параметр 'background' в выводе.
{
"_id" : ObjectId("4de2c1a5c9907a4e77467826"),
"ns" : "mydb.items",
"key" : {
"itemA" : 1,
"itemB" : -1,
"itemC" : -1
},
"name" : "itemA_1_itemB_-1_itemC_-1",
"v" : 0
}
Должен ли я сбросить индекс и начать заново? или параметр index-in-background просто не отображается?
@ TTT из комментариев: Вы хотите асинхронное обновление индекса после того, как вы вставили, обновили или удалили документ?
Я думаю так. Я бы хотел, чтобы скорость запросов системы всегда была максимальной, поэтому мне определенно нужны индексы, но бывают и случаи, когда я запускаю десятки тысяч вставок. Это становится проблемой для всей системы, поскольку загрузка ЦП Mongo увеличивается до 99,9% в течение всего периода обновления.
Я думаю, что обновление индексов в фоновом режиме - это ответ, но я читал в документах MONGO, что если индекс пересчитывается, он не используется в запросах до тех пор, пока не будет выполнен перерасчет.
Моя идеальная «ситуация сна» заключается в том, что система будет использовать «последний лучший индекс» до тех пор, пока не завершится процесс фонового обновления (или даже просто всегда использует текущий самый известный индекс).