Создание индекса занимает очень много времени - PullRequest
15 голосов
/ 24 июня 2011

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

words : слова, проанализированные с URL-адреса выше. Размер списка составляет от 15 до 90.

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

Я сделаю запрос к этой коллекции, используя поле words , поэтому я создал (или скорее начал создавать) индекс для этого поля:

db.my_coll.ensureIndex({words: 1})

Я начал создавать индекс около 3 часов назад, и не похоже, что он может закончиться через 3 часа.

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

Ответы [ 3 ]

17 голосов
/ 24 июня 2011

Нет, индексирование выполняется медленно для больших коллекций.Вы также можете создать индексирование в фоновом режиме:

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

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

3 голосов
/ 01 марта 2017

Фоновые индексы также имеют некоторые проблемы.

1) Во всяком случае, это займет больше времени из-за нагрузки на ваш сервер. 2) Если по какой-то причине его прервать, он перезапустится как сборка на переднем плане

Если у вас есть набор реплик, я предпочитаю делать "построение скользящего индекса". 1. Извлечь вторичный из набора реплик 2. Построить индекс 3. Вставьте вторичную часть обратно в набор реплик

Я думаю, что это самое чистое решение.

0 голосов
/ 07 июля 2016

У нас была такая же проблема с большой коллекцией (около 150 миллионов предметов). Сначала мы вставили данные, затем создали индекс с оценкой времени - 20 часов для всей коллекции. Это не звучит хорошо ...

Итак, мы нашли решение для повышения производительности - запускаем монго с вилами. https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/#start-mongod-as-a-daemon

$ mongod --fork ...

С помощью вилок наш индекс был создан за 1,5 часа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...