Mongodb 优化方案 真的不来看看?兴许面试能用到呀! 摘自《Mongodb管理与开发精要》

387 阅读2分钟
我是中国“著名” 黑客 我的帖子你们都无法点赞(狗头.wep)

优化方案 1: 创建索引

在查询条件的字段上,或者排序条件的字段上创建索引,可以显著提高执行效率:

db.posts.ensureIndex({ts:1});

优化方案 2: 限定返回结果条数

使用 limit()限定返回结果集的大小,可以减少 database server 的资源消耗,可以减少网络传 输数据量。

articles = db.posts.find().sort({ts:-1}).limit(10);

优化方案 3: 只查询使用到的字段,而不查询所有字段

在本例中,博客日志记录内容可能非常大,而且还包括了评论内容(作为 embeded 文档)。 所以只查询使用的字段,比查询所有字段效率更高:

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);

优化方案 4: 采用 capped collection

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 的 记录。

优化方案 5: 采用 Server Side Code Execution

Server-Side Processing 类似于 SQL 数据库的存储过程,使用 Server-Side Processing 可以减小网 络通讯的开销。

优化方案 6: Hint

一般情况下 MongoDB query optimizer 都工作良好,但有些情况下使用 hint()可以提高操作效 率。Hint 可以强制要求查询操作使用某个索引。例如,如果要查询多个字段的值,如果在其 中一个字段上有索引,可以使用 hint:

db.collection.find({user:u, foo:d}).hint({user:1});

优化方案 7: 采用 Profiling

Profiling 功能肯定是会影响效率的,但是不太严重,原因是他使用的是 system.profile 来记 录,而 system.profile 是一个 capped collection 这种 collection 在操作上有一些限制和特点, 但是效率更高。