免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2140 | 回复: 0
打印 上一主题 下一主题

[MongoDB] MongoDB管理与开发精要《红丸出品》19 性能优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-12 20:38 |只看该作者 |倒序浏览
第十九章 性能优化
如果nscanned(扫描的记录数)远大于nreturned(返回结果的记录数)的话,那么我们就要考虑通过加索引来优化记录定位了。
reslen 如果过大,那么说明我们返回的结果集太大了,这时请查看find函数的第二个参数是否只写上了你需要的属性名。
对于创建索引的建议是:如果很少读,那么尽量不要添加索引,因为索引越多,写操作会越慢。如果读量很大,那么创建索引还是比较划算的。

假设我们按照时间戳查询最近发表的10篇博客文章:
articles = db.posts.find().sort({ts:-1});

for (var i=0; i< 10; i++) {
   print(articles.getSummary());
}
19.1 优化方案1: 创建索引
在查询条件的字段上,或者排序条件的字段上创建索引,可以显著提高执行效率:
db.posts.ensureIndex({ts:1});
19.2 优化方案2: 限定返回结果条数
使用limit()限定返回结果集的大小,可以减少database server的资源消耗,可以减少网络传输数据量。
articles = db.posts.find().sort({ts:-1}).limit(10);
19.3 优化方案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);
19.4 优化方案4: 采用capped collection
capped Collections比普通Collections的读写效率高。CappedCollections是高效率的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的记录。
19.5 优化方案5: 采用Server Side Code Execution
Server-Side Processing类似于SQL数据库的存储过程,使用Server-SideProcessing可以减小网络通讯的开销。
19.6 优化方案6: Hint
一般情况下MongoDB queryoptimizer都工作良好,但有些情况下使用hint()可以提高操作效率。Hint可以强制要求查询操作使用某个索引。例如,如果要查询多个字段的值,如果在其中一个字段上有索引,可以使用hint:
db.collection.find({user:u, foo:d}).hint({user:1});
19.7 优化方案7: 采用ProfilingProfiling功能肯定是会影响效率的,但是不太严重,原因是他使用的是system.profile 来记录,而system.profile 是一个capped collection 这种collection 在操作上有一些限制和特点,但是效率更高。

------------------------------------------------------------------------------------------------------------

免费IT培训(ChinaDBA.net)实践者!学费1元,全捐公益


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP