В настоящее время у меня есть некоторый код, который должен выполнять несколько обновлений для каждого пользователя для тысяч пользователей, увеличивая счетчик в зависимости от действия, которое они предприняли, чтобы отслеживать, какие действия выполняются.Каждое действие состоит из подгрупп, которые также должны обновлять счет.Они должны отслеживаться по дням.
Поэтому я храню «action»: «actionName», «day»: day, «count»: count для действий в день (например, поступающих с внешней веб-страницы,запустить игру, остановить игру, выйдя из игры, объединяя ее с названием игры для многих игр).
Каждый день я добавляю несколько тысяч строк (по одному на уникальное действие), которые обновляются несколько сотен тысяч раз каждыйдень для увеличения счетчика.
Соответствующий код выглядит следующим образом (создание массива действий не входит).
$m = new Mongo();
$db = $m->actionsDB;
$collection = $db->action_count;
foreach ($arr as $action) {
$collection->update(array("action" => $action, "day" => $day),array('$inc' => array("count" => 1)),array("upsert" => true));)
}
$collection->ensureIndex(array("action" => 1, "day" => -1));
Примером серии обновлений, выполненных для действия и подзадач, будетbe: startGame, 20110417;startGameZork, 20110417;startGameZorkWindows, 20110417
Кажется, проблема в том, что при выполнении этого кода на сервере команды mongo в оболочке помещаются в очередь.
В настоящее время я не уверен, почему, я думаю,может быть проблема производительности с таким количеством обновлений в секунду.
Что меня интересует, как я могу повысить производительность?Я довольно новичок в монго, поэтому не совсем уверен, какие варианты доступны.Я посмотрел на PHP batchInsert, но не вижу упоминаний о выполнении batchUpdate (поэтому вместо обновления создайте массив, содержащий все данные, которые я в данный момент обновляю, а затем выполните batchUpdate за одну поездку в БД).
Версия драйвера Mongo - 1.2.0, поэтому постоянные соединения по умолчанию.
Редактировать: db.serverStatus () до, во время и после ~ 1600 обновлений в секунду (30 секунд). Данные испытаний