2013-07-20 3 views
1

Любая помощь по этому вопросу будет оценена по весу.Почему мои запросы MongoDB замедляются после добавления новых элементов в коллекцию?

У меня есть большая коллекция Mongodb, в которой хранятся действия пользователя. Она содержит несколько составных индексов для запросов, которые я хочу запустить, и обычно производительность запросов является фантастической, и потоки активности пользователей загружаются немедленно.

Однако в последнее время я добавил фоновую задачу, которая добавляет 20 к записей в коллекцию каждые 2 часа (одна новая запись для каждого пользователя). Поскольку эта задача была добавлена, я заметил, что в первый раз, когда я посещаю поток активности после добавления этих записей, перед загрузкой страницы происходит огромная задержка. Затем, когда я обновляю страницу, она быстро загружается.

Кажется, что новые предметы добавляются только к индексу после того, как я попытаюсь получить к ним доступ. Но из того, что я читал в FAQ MongoDB, они автоматически добавляются в индекс - http://docs.mongodb.org/manual/faq/indexes/#should-you-run-ensureindex-after-every-insert. Возможно, это случай, когда они еще не добавлены?

Вот моя статистика посещений, если это помогает.

Array 
(
[ns] => main.activities 
[count] => 26280825 
[size] => 3234981772 
[avgObjSize] => 123.09285465734 
[storageSize] => 4211892224 
[numExtents] => 30 
[nindexes] => 20 
[lastExtentSize] => 844685312 
[paddingFactor] => 1.001 
[systemFlags] => 1 
[userFlags] => 0 
[totalIndexSize] => 25240448464 
[indexSizes] => Array 
    (
     [_id_] => 946551872 
     [portfolio_id_1_type_1_timestamp_-1] => 1519746704 
     [project_id_1_type_1_timestamp_1] => 1839902512 
     [project_id_1] => 1148997808 
     [piece_id_1] => 792794016 
     [user_id_1_type_1_timestamp_-1] => 1903806128 
     [type_1_timestamp_-1] => 1475522720 
     [user_id_1_type_1] => 1440243280 
     [project_id_1_type_1] => 1394008000 
     [project_id_1_type_1_timestamp_1_project_page_timestamp_1] => 2114419888 
     [project_id_1_type_1_project_page_timestamp_1] => 1564649296 
     [conversation_id_1] => 870670416 
     [project_comment_id_1] => 814640288 
     [project_comment_id_1_type_1] => 1032408048 
     [reply_to_comment_id_1] => 512324512 
     [collection_id_1] => 822996160 
     [user_id_1] => 1233578528 
     [portfolio_id_1] => 852691392 
     [type_1_user_id_1] => 1477182448 
     [type_1_user_id_-1] => 1483314448 
    ) 

[ok] => 1 
) 

ответ

1

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

Если вы запускаете мангостат при первой загрузке страницы и видите ряд неисправностей, вам нужно больше памяти.

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

[project_id_1] => 1148997808 
    [user_id_1_type_1] => 1440243280 
    [project_id_1_type_1] => 1394008000 
    [project_comment_id_1] => 814640288 
    [user_id_1] => 1233578528 
    [portfolio_id_1] => 852691392 

Кроме того, один из этих показателей, вероятно, могут быть удалены, поскольку они отличаются только в направлении последнего поля. Единственный случай, который неверен, - это то, что ваше приложение сортирует результаты запроса как с {type: 1, user_id: 1}, так и {type: 1, user_id: -1} в качестве документа сортировки.

[type_1_user_id_1] => 1477182448 
    [type_1_user_id_-1] => 1483314448 

Есть другие индексы, которые могут быть удалены в зависимости от текущих запросов.

HTH - Rob.

+0

Спасибо, Роб, это действительно помогает. Итак, по тому, что вы говорите: можно использовать индекс user_id_1_type_1_timestamp_-1, как это было 3 разных индекса: 'user_id_1', 'user_id_1_type_1' и 'user_id_1_type_1_timestamp_-1' (например). Я понятия не имел, что это возможно. Это действительно должно спасти некоторую RAM. – noel

+0

Я также нашел этот ответ очень полезным http://stackoverflow.com/a/7635093/785518 – noel

+0

Да - точно. Его также можно использовать, когда порядок отменяется: user_id_-1_type_-1_timestamp_1, user_id_-1_type_-1 и user_id_-1. –