Создание индекса занимает очень много времени
Я создал коллекцию в MongoDB, состоящую из 11446615 документов.
Каждый документ имеет следующую форму:
{
"_id" : ObjectId("4e03dec7c3c365f574820835"),
"httpReferer" : "http://www.somewebsite.pl/art.php?id=13321&b=1",
"words" : ["SEX", "DRUGS", "ROCKNROLL", "WHATEVER"],
"howMany" : 3
}
httpReferer: только URL
слова: слова, проанализированные с помощью URL-адреса выше. Размер списка составляет от 15 до 90.
Я планирую использовать эту базу данных для получения списка веб-страниц, имеющих похожий контент.
Я запрошу этот сборник, используя поле words, чтобы я создал (или скорее начал создавать) индекс в этом поле:
db.my_coll.ensureIndex({words: 1})
Я начал создавать индекс около 3 часов назад, и похоже, что он не смог закончить еще через 3 часа.
Как увеличить скорость индексации? Или, может быть, я должен использовать совершенно другой подход к этой проблеме? Любые идеи приветствуются:)
Ответы
Ответ 1
Нет, индексирование медленное для больших коллекций. Вы также можете создать индексирование в фоновом режиме:
db.my_coll.ensureIndex({words:1}, {background:true});
Создание индекса в фоновом режиме будет медленнее и приведет к большему индексу. Однако он не будет использоваться до тех пор, пока индексация не будет завершена, поэтому пока вы сможете нормально использовать базу данных, и индексирование не будет блокироваться.
Ответ 2
Фоновые индексы также имеют некоторые проблемы.
1) Если что-то должно занять больше времени из-за нагрузки на ваш сервер.
2) Если прервано по какой-либо причине, он перезапустится как сборка переднего плана
Если у вас есть набор реплик, я предпочитаю делать "скользящую индексную сборку".
1. Возьмите вторичный набор реплик
2. Строить индекс
3. Вставьте вторичную обратно в набор реплик.
Я думаю, что это самое чистое решение. Подробнее здесь - https://scalegrid.io/blog/the-perils-of-building-indexes-on-mongodb/
Ответ 3
У нас была та же проблема с большой коллекцией (около 150 миллионов объектов). Сначала мы вставили данные, затем мы создали индекс с оценкой времени - 20 часов для всей коллекции. Это не звучит хорошо...
Итак, мы нашли решение для улучшения производительности - запустите mongo с вилками.
https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/#start-mongod-as-a-daemon
$ mongod --fork ...
С вилками наш индекс был создан около 1,5 часов.