Как улучшить производительность update () и save () в MongoDB? - PullRequest
8 голосов
/ 21 июня 2011

Я ищу советы о том, как повысить производительность базы данных в следующей ситуации.

В качестве примера приложения я написал сегодня довольно простое приложение, которое использует API потоковой передачи Twitter для поиска по определенным ключевым словам.Затем я сохраняю результаты в MongoDB.Приложение написано с Node.js.

Я храню 2 коллекции.Один хранит ключевое слово и массив идентификаторов твитов, которые ссылаются на каждый найденный твит с упоминанием этого ключевого слова.Они добавляются в базу данных с помощью .update () с {upsert: true}, так что новые идентификаторы добавляются в массив 'ids'.

Пример документа из этой коллекции выглядит следующим образом:

{"_id": ObjectId ("4e00645ef58a7ad3fc9fd9f9"), "ids": ["id1", "id2", "id3"], "keyword": "#chocolate"}

Обновить код:

 keywords.update({keyword: key_word},{$push:{ids: id}},{upsert:true}, function(err){})

2-я коллекция выглядит следующим образом и добавляется просто с помощью .save ()

 {
     "twt_id": "id1",
     "tweet": { //big chunk of json that doesn't need to be shown }
 }

Я запустил это на своем Macbook прямо сейчас, и он собираетсяоколо 2 часов.Я храню много данных, вероятно, несколько сотен документов в минуту.В настоящее время число объектов в Mongodb составляет 120 000+.

Что я замечаю, так это то, что загрузка ЦП для процесса базы данных достигает 84% и постепенно увеличивается с момента запуска последней версии.тестовый прогон.

Я читал о настройке индексов, но так как я добавляю документы, а не выполняю запросы к ним, я не уверен, помогут ли индексы.Мне пришла в голову мысль, что update () может выполнять поиск, так как я использую $ push, и что индекс может помочь с этим.

Что я должен смотреть, чтобы не съесть MongoDBпостоянно увеличивающееся количество процессоров?

Ответы [ 3 ]

9 голосов
/ 21 июня 2011

Весьма вероятно, что вы попали в очень распространенную бутылочную горлышко в MongoDB. Поскольку вы очень часто обновляете документы, добавляя строки, есть большая вероятность того, что у вас недостаточно места для этого документа и вынуждает базу данных постоянно перемещать этот документ в другое место в памяти \ диске, перезаписывая его в хвостовой части файла данных.

Добавление индексов может только снизить производительность записи, что не поможет повысить производительность, если вы не слишком интенсивно читаете.

Я хотел бы рассмотреть изменение логики вашего приложения, чтобы сделать это:

  1. Индекс по ключевому слову
  2. Прежде чем вставлять что-либо в базу данных каждый раз, когда вы обнаруживаете твит, запросите документ, который содержит ключевое слово. Если он не существует, вставьте новый документ, но добавьте свойство ids, добавив в массив целый набор поддельных строк. Затем сразу после вставки удалите все идентификаторы из этого массива. Это приведет к тому, что mongodb выделит дополнительное пространство для всего этого документа, так что, когда вы начнете добавлять идентификаторы в поле идентификаторов, у него будет достаточно места для роста.
  3. Вставьте идентификатор твита в поле ids
7 голосов
/ 21 июня 2011

Вы на правильном пути. Часть запроса вашего обновления нуждается в индексе, в противном случае выполняется сканирование таблицы. Индекс отступа для ключевого слова, и вы увидите, что производительность обновления значительно возрастет.

0 голосов
/ 03 января 2019

https://docs.mongodb.com/manual/reference/operator/update/positional/#up.S

Надеюсь вам помочь!

Позиционный оператор $ идентифицирует элемент в массиве для обновления без явного указания позиции элемента в массиве. https://getvideo.pro/watch/mongodb-querying-sub-documents-and-using-the-positional-operator-in-projection-vid-fEvYkBDW0Iw или: https://getvideo.pro/watch/mongodb-a-to-z-video-18-updating-multiple-documents-with-positional-operator-vid-Z2dTXbktLEQ

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