转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80009221
如果 nscanned(扫描的记录数)远大于 nreturned(返回结果的记录数)的话,那么我们就要考虑通过加索引来优化记录定位了。reslen 如果过大,那么说明我们返回的结果集太大了,这时请查看 find 函数的第二个参数是否只写上了你需要的属性名。对于创建索引的建议是:如果很少读,那么尽量不要添加索引,因为索引越多,写操作会越慢。如果读量很大,那么创建索引还是比较划算的。
假设我们按照时间戳查询最近发表的 10 篇博客文章:
articles = db.posts.find().sort({ts:-1});
for (var i=0; i< 10; i++) {
print(articles[i].getSummary());
}
db.posts.ensureIndex({ts:1});
articles = db.posts.find().sort({ts:-1}).limit(10);
articles = db.posts.find({}, {ts:1,title:1,author:1,abstract:1}).sort({ts:-1}).limit(10);
注意:如果只查询部分字段的话,不能用返回的对象直接更新数据库。下面的代码是错误的:
a_post = db.posts.findOne({}, Post.summaryFields);
a_post.x = 3;
db.posts.save(a_post);
capped Collections 比普通 Collections 的读写效率高。Capped Collections 是高效率的 Collection类型,它有如下特点:
1) 固定大小; Capped Collections 必须事先创建,并设置大小:
db.createCollection("mycoll", {capped:true, size:100000})
2) Capped Collections 可以 insert 和 update 操作;不能 delete 操作。只能用 drop() 方法删除整个 Collection。
3) 默认基于 Insert 的次序排序的。如果查询时没有排序,则总是按照 insert 的顺序返回。
4) FIFO。如果超过了 Collection 的限定大小,则用 FIFO 算法,新记录将替代最先 insert 的记录。
Server-Side Processing 类似于 SQL 数据库的存储过程,使用 Server-Side Processing 可以减小网络通讯的开销。
一般情况下 MongoDB query optimizer 都工作良好,但有些情况下使用 hint()可以提高操作效率。 Hint 可以强制要求查询操作使用某个索引。例如,如果要查询多个字段的值,如果在其中一个字段上有索引,可以使用 hint:
db.collection.find({user:u, foo:d}).hint({user:1});