我正在使用mongodb,我需要更新我的文档,说总共有1000个。我的文档具有如下基本结构:Mongodb性能问题
{
People:[1,2,3,4],
Place:"Auckland"
Event:"Music Show"
}
我在另一个虚拟机中同时运行10,000个线程。每个线程都会查找这些文档(1000),查看这1000个文档是否与查询匹配并在People数组中推送一个数字。假设如果线程100在这1000个相关文档中找到了500个,那么它会将所有500个文档的People数组中的数字100推送出去。 为此,
我使用每个线程(10000)命令
update.append("$push",new BasicDBObject("People",serial_number));
updateMulti(query,update);
我观察这些就地升级(多查询)表现不佳。 这是由于写入锁定引起的问题吗? 每个线程(10000)都会更新与查询相关的文档? - 所以似乎有很多“等待” 有没有更有效的方法来做这些“推”操作? “UpdateMulti”是否是正确的方法?
钍ANK你很大的反响 - 编辑和添加一些更多的信息
一些设计背景:
您是我们的问题的理解是正确的。我们有10000个线程,每个线程代表一个“演员”,每次更新多达1000个实体(基于适当的查询),每次推送一次。
反转模型导致我们导致一些破碎的用例(从我们的领域的角度来看)导致我们加入主要实体的“状态”(现在将分散在许多集合中) - 例如:这些操作中的每一个都是该实体的状态变化 - E具有状态(e1,e2,e3,e4,e5) - 因此e1至e5表示为由10,000个线程/进程更新的聚合数组,这些线程/进程表示外部应用程序的动作。
我们需要接近实时聚合,因为另一组“演员”查看e1到e5的这些“状态”,然后通过另一个通道适当地响应“阵列中的元素”。
在这种情况下,什么应该是“理想”的设计策略 - 加快写入速度。 将分片的帮助 - 是否有一个“量级”的启发式 - 在什么锁定%我们应该碎片等。
需要一些澄清 - 事先已知的状态?换句话说,有多少个州--5?如果是这样,为什么他们必须是一个数组?你可以给出一个文件“进行中”的例子以及另一组演员正在使用的查询类型吗? –
C {a1 =“”,// //属性a2 =“”,a3 =“”C_s1 = [a1,a2,a3,a4,...] //实体C的状态s1 C_s2 = [a5, a3,a4,...] C_s3 = [a1,a2,a3,a4,...] C_s4 = [a1,a2,a3,a4,...] C_s5 = [a1,a2,a3 ,a4,....]}这5个状态已经被编码为数组类型 - 因此,对于一个给定的ai实例,执行多更新的任何查询都将从“ai”的角度来看 - 它可能需要更新多个C在不同的状态下适用 - 即C1中的s1,C3中的s2等......每隔几分钟。另一位演员只看着他们各自的状态,并与他们交往,引导他们通过国家机器@Asya Kamsky –