`
风雪涟漪
  • 浏览: 508590 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9069
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18481
社区版块
存档分类
最新评论

MongoDB 优化

阅读更多


优化一个简单的例子

这部分主要讲解如何优化MongoDB的性能。

让我们举个具体示例。假使我们的任务是现实blog的首页-我们希望现实最近发布的10条posts。ts为时间字段。

语句如下

articles = db.posts.find().sort({ts:-1}); 
// get blog posts in reverse time order
for (var i=0; i< 10; i++) 
{   print(articles[i].getSummary());}
优化 #1: 创建索引

第一个优化就是要在ts上创建索引,用来快速排序。

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

使用索引,数据库就可以基于索引信息排序,不会直接查看每个document。这样做更快。

优化#2: 限定结果

MongoDB游标返回一组document,我们叫这个为chunks。

这chunk可能包含超过10个对象。额外的对象对于我们的需求是浪费,

浪费了网络带宽和应用服务器以及数据库的资源。

我们知道想要结果的个数,那么就不需要所有的结果。我们可以使用limit()方法

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

现在,我们从客户端返回了10条。

优化 #3: 查询相关的字段

post对象非常大, 如post文本和评论数组。 比较好的方式是只查询我们要用到的字段。

articles = db.posts.find({}, {ts:1,title:1,author:1,abstract:1}).sort({ts:-1}).limit(10);
articles.forEach( function(post) { print(post.getSummary()); } );

上面的getSummary()方法假使是可以获得find()方法返回的字段值

注意,如果你选择了要查询的字段,那么返回的就是部分对象。这个对象并不能直接进行更新。如下

a_post = db.posts.findOne({}, Post.summaryFields);
a_post.x = 3;
db.posts.save(a_post); // 错误,抛出异常

使用 Profiler

MongoDB有一个数据库的 profiler,用来显示每个操作的性能。

使用profiler你可以查看到哪些查询或者写入的速度比较慢。

举个例子,使用这些信息可以知道什么时候需要索引。详情查看 Database Profiler 。

 Use count()优化语句

加速语句速度依赖于count(),创建一个索引,调用count()。

db.posts.ensureIndex({author:1});
db.posts.find({author:"george"}).count();

增量操作Increment Operations

MongoDB 支持简单对象字段的增量操作; 

基本上来说, 这个操作就是 在服务器document中增量一个字段"。

这个要比"获取一个document,更新这个字段并且在保存会服务器"这个方法快很多,

并且对于实时的计数器更为有用。详情请看  Updates 。

固定大小的collection。

MongoDB提供了一个特殊的collection,它提前分配好了存储空间。

保存的项都是固定顺序的,并且没有索引。而且写入和读取是非常高速的。

存储是为了保存日志文件所设置的。详情查看 Capped Collections 

服务端代码执行Server Side Code Execution

也许有的时候为了高性能,避免客户端和服务端来回通信,需要直接在服务端执行代码。

这部分查看 Server-Side Processing 。

Explain工具

要想查看查询语句的详细性能信息,最好的方法就是使用explain方法。

返回的结果就是整个查询执行的一些信息。

当使用shell的时候,可以调用cursor的explain() 方法。

db.collection.find(query).explain();

返回的信息如下

{"cursor" : "BasicCursor",    
"indexBounds" : [ ],    
"nscanned" : 57594,    
"nscannedObjects" : 57594,    
"nYields" : 2 ,    
"n" : 3 ,    
"millis" : 108,    
"indexOnly" : false}
现实结果可以得知cursor的类型,DB扫描的数据数,返回的数据数,还有执行的毫秒数。

  • nscanned - 扫描的数据条数。这个数据可能是对象也可能是索引的键。
  • 如果"覆盖索引(covered index)"被调用了,nscanned 要高于nscannedObjects.
  • nscannedObjects - 扫描对象的数。
  • nYields - 查询所产生的锁的个数。
  • indexOnly - 是否使用了covered index。

Hint

虽然MongoDB查询优化器一般工作的很不错,但是也可以使用hints来强迫MongoDB使用一个指定的索引。

这种方法某些情形下会提升性能。 一个有索引的collection并且执行一个多字段的查询(一些字段已经索引了)。

传入一个指定的索引,强迫查询进行使用。

 

db.collection.find({user:u, foo:d}).hint({user:1});
确定创建了索引。
上面的例子,首先你确定索引已经创建了。请使用ensureIndex()创建索引。

其他的例子,有个在 {a:1, b:1} 上的索引,名称为"a_1_b_1":

db.collection.find({a:4,b:5,c:6}).hint({a:1,b:1});
db.collection.find({a:4,b:5,c:6}).hint("a_1_b_1");

强迫查询不适用索引, (做一个表的扫描), 使用:

> db.collection.find().hint({$natural:1})
分享到:
评论
2 楼 biaoming 2014-07-17  
楼主用mongo好早啊。
1 楼 biaoming 2014-07-17  
好教程,学习了。。。

相关推荐

    mongodb优化

    针对 MongoDB 的优化是提高数据库性能的关键,这通常涉及到多个方面,包括内存配置、查询优化、索引管理和集群架构调整等。 首先,我们可以修改 MongoDB 的默认内存配置以适应更大的数据处理需求。在 MongoDB ...

    MongoDB优化器执行器介绍.pptx

    本篇文章将深入探讨MongoDB的优化器执行器,包括慢查询的产生与发现、索引的工作原理、优化器的工作机制以及多键索引的影响和注意事项。 首先,慢查询通常是由于查询读取了过多的文档导致的。MongoDB提供了一个名为...

    MongoDB的分析和报告的解决方案

    这涉及到正确配置硬件资源、优化数据库架构、设置合适的复制集以实现高可用性,以及定期维护和监控。 总的来说,MongoDB为JavaScript开发者提供了强大的数据分析和报告工具。通过理解其核心特性,如聚合框架、索引...

    MongoDB优化心得分享

    本文主要分享了关于MongoDB优化的一些关键心得,旨在帮助开发者更好地管理和优化MongoDB实例。 首先,MongoDB的参数配置至关重要。其中,`storageEngine` 和 `directoryperdb` 是两个重要的设置。`directoryperdb` ...

    MySQL与MongoDB数据库架构介绍.pptx

    MongoDB 优化可以通过调整 MongoDB 配置文件、优化查询语句、使用索引、分片、缓存等方式来实现。 MySQL 和 MongoDB 的比较 MySQL 和 MongoDB 都是流行的数据库管理系统,但它们有着不同的设计理念和应用场景。...

    MongoDB存储引擎全景解析:优化数据存储的策略

    3. **高性能**:MongoDB优化了读写操作,提供了高性能的数据访问,特别是在处理大量的读写操作时。 4. **高可用性**:通过副本集(Replica Sets)实现,副本集是一组维护相同数据集的MongoDB服务器,可以提供数据的...

    MongoDB内存管理和缓存机制解析:优化性能的关键策略

    3. **高性能**:MongoDB优化了读写操作,提供了高性能的数据访问,特别是在处理大量的读写操作时。 4. **高可用性**:通过副本集(Replica Sets)实现,副本集是一组维护相同数据集的MongoDB服务器,可以提供数据的...

    MongoDB疑难杂症分析及优化

    MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化...

    mongodb性能优化.pptx

    ### MongoDB性能优化详解 #### 一、MongoDB性能优化概述 MongoDB作为一种广泛使用的NoSQL数据库,因其灵活性和高扩展性而备受青睐。然而,在实际应用过程中,由于数据量的增长和查询复杂性的增加,可能会遇到性能...

    mongoDB安装与配置主从

    MongoDB 安装与配置主从关系需要考虑多方面的因素,包括安装、配置、创建数据库和用户、创建索引、主从配置和优化等。只有通过合理的配置和优化,才能发挥 MongoDB 的强大功能,提高系统性能和可用性。

    mongodb-linux-x86_64-3.4.6

    在3.4.6版本中,MongoDB优化了存储引擎,如WiredTiger,提供了更好的空间利用率和更快的读写速度。 2. **查询性能**:MongoDB支持丰富的查询语法,包括聚合框架、地理空间索引、正则表达式匹配等。3.4.6版本进一步...

    万亿级文档数据库MongoDB集群性能优化实践.pdf

    "MongoDB集群性能优化实践" 本文档主要介绍了MongoDB集群性能优化实践,涵盖了从 MongoDB 集群优化到解决方案的分享。通过本文档,我们可以了解到 MongoDB 集群性能优化的重要性,并学习到实际的解决方案。 知识点...

    MongoDB存储过程:探索NoSQL数据库的高级编程

    3. **高性能**:MongoDB优化了读写操作,提供了高性能的数据访问,特别是在处理大量的读写操作时。 4. **高可用性**:通过副本集(Replica Sets)实现,副本集是一组维护相同数据集的MongoDB服务器,可以提供数据的...

    MongoDB GridFS:管理大型文件存储的高效方案

    3. **高性能**:MongoDB优化了读写操作,提供了高性能的数据访问,特别是在处理大量的读写操作时。 4. **高可用性**:通过副本集(Replica Sets)实现,副本集是一组维护相同数据集的MongoDB服务器,可以提供数据的...

    深入MongoDB日志系统:配置、监控与最佳实践

    3. **高性能**:MongoDB优化了读写操作,提供了高性能的数据访问,特别是在处理大量的读写操作时。 4. **高可用性**:通过副本集(Replica Sets)实现,副本集是一组维护相同数据集的MongoDB服务器,可以提供数据的...

Global site tag (gtag.js) - Google Analytics