我有一些mongodb问题可以解决慢查询问题。以下显示了我的mongodb日志中的2个条目。我使用mongodb版本2.4.12。在这种情况下,这些查询的响应时间很长。 ( 2354ms 和 1173ms 相应)。我知道第一个是READ查询,第二个是UPDATE查询。
第一次查询
Mon Sep 01 11:00:01.171 [conn11431867]查询myapp.User查询:{clientId:40000} ntoreturn:0 ntoskip:0 nscanned:278045 keyUpdates:0 numYields:2 locks(micros)r:4187970 nreturned:18 reslen:14091 2354ms
第二次查询
Mon Sep 01 22:10:00.394 [conn11374746]更新myapp.User查询:{_ id:ObjectId(&#39; 5789999e4b06d0f3aeeb947&#39;)}更新:{_ id:ObjectId(&#39; 5789999e4b06d0f3aeeb947& #39;),className:&#34; com.myapp.domain.User&#34;,firstName:&#34; Amila&#34;,lastName:&#34; Iddamalgoda&#34;,userId:10001000,loginId: &#34; amilai&#34;,emailAddress:&#34; test@test.com" ;, clientId:40000} idhack:1 nupdated:1 keyUpdates:0 locks(micros)w:189 1592ms < / p>
有人可以提供以下问题的答案吗?谢谢。欣赏很多。
1。)我也使用分片。对于此用户集合索引设置为&#39; userId &#39;。什么可能是mongo响应时间缓慢的根本原因? ( 2354ms 且 1173ms )
2.。)在第一个查询日志中,查询:{clientId:40000} 是什么意思?是mongo使用clientId键找到用户? nscannedObjects ==&gt;扫描的文件数量。但是&#39; r &#39;并且&#39; nreturned &#39;和&#39; reslen &#39;是什么意思?
3.)我知道mongo正在使用多粒度锁定。但在这种情况下,这个响应时间是写锁定的结果吗?
4。)我需要分解第二个查询(更新查询)中显示的内容。它是从ObjectId读取并更新单个字段还是?什么去那儿?
答案 0 :(得分:1)
逐一回答你的问题:
{ clientId: 40000 }
。此日志的查询语句为db.User.find({ clientId: 40000 })
。并且您的索引位于 userId ,此查询需要 clientId 上的索引才能加速。对于需要多个锁的操作,例如锁定本地数据库以更新oplog的操作,此值可能长于操作的总长度(即毫秒)。
总结一下,考虑在 clientId 上创建一个索引。