Подтвердить что ты не робот

Создание индекса занимает очень много времени

Я создал коллекцию в 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 часа.

Как увеличить скорость индексации? Или, может быть, я должен использовать совершенно другой подход к этой проблеме? Любые идеи приветствуются:)

4b9b3361

Ответ 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 часов.