我目前有一些代码需要为数千个用户的每个用户执行多次更新,根据他们所采取的操作增加计数器,以便跟踪正在执行的操作。每个操作都包含子操作,这些子操作也需要更新计数。这些都需要按天进行跟踪。
因此,我存储“action”:“actionName”,“day”:day,“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));
Run Code Online (Sandbox Code Playgroud)
对操作和子操作进行的一系列更新的示例是:startGame,20110417;启动GameZork,20110417;启动GameZorkWindows,20110417
问题似乎是,当这段代码在服务器上运行时,shell 中的 mongo 命令会排队。
目前我不确定为什么,我猜每秒更新这么多可能存在性能问题。
我想知道如何才能提高性能?我对 mongo 还很陌生,所以不完全确定有哪些选项可用。我查看了PHP的batchInsert,但我看不到任何提及执行batchUpdate的内容(因此不是更新,而是创建一个包含我当前更新的所有数据的数组,然后在一次数据库访问中执行batchUpdate)。
Mongo驱动版本是1.2.0,所以默认是长连接。
编辑:每秒约 1600 次更新(30 秒)之前、期间和之后的 db.serverStatus()。测试数据