必须使用索引,因为更新的第一步就是查询,所以要去查询日志,比如:
db.system.profile.find({nscanned:{"$gt":1},ns:{"$ne":"xxx.system.profile"}},{op:1,ns:1,query:1,millis:1,nscanned:1,reslen:1}), 可以找出扫描数超过一行的. 和没有使用索引的, 记住索引永远都是mongoDB的最大问题.
索引会带来更多的问题. 非常大的内存占用 和 cpu开销.这也是更新时越来越慢的原因之一, 如果更新频繁,插入不多的话,请使用 _id 作为主键, 直接在业务中拼凑_id, 查询时直接使用_id.
更新的时候 不能直接更新整个bson,要局部更新字段, 这样流量会小下来.
查看瓶颈到底是在io 还是内存 还是 cpu. 如果数据量或者索引的容量超过了物理内存大小.mongoDB的效率是要降低一个量级的
在MongoDB中,文档是对数据的抽象,它被使用在Client端和Server端的交互中。所有的Client端(各种语言的Driver)都会使用这种抽象,它的表现形式就是我们常说的BSON(Binary JSON )。
BSON是一个轻量级的二进制数据格式。
MongoDB能够使用BSON,并将BSON作为数据的存储存放在磁盘中。
当Client端要将写入文档,使用查询等等操作时,需要将文档编码为BSON格式,然后再发送给Server端。同样,Server端的返回结果也是编码为BSON格式再放回给Client端的。